作者:patrick0129_645 | 来源:互联网 | 2024-10-25 16:14
在JavaScript中,原型和原型链是核心概念。通过定义构造函数`functionFoo(){}`,可以创建实例对象`letf1=newFoo()`。继承机制主要依赖于每个函数都具有的`prototype`属性,除了内置的`Function`构造函数之外,这一特性使得对象间的属性和方法共享成为可能。原型链通过链接这些原型对象,实现了复杂而灵活的继承结构,为JavaScript的面向对象编程提供了坚实的基础。
组织函数:function Foo ( ) { };
实例对象:let f1=new Foo;
- 谈到继续时,Javascript 只要一种构造:对象
- 每一个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向原型。
prototype
每一个Javascript对象(null除外)在建立的时刻就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都邑从原型”继续”属性。
函数的 prototype
属性指向了一个对象,这个对象恰是挪用该组织函数而建立的实例的原型,也就是这个例子中的 f1 的原型
。prototype带有__proto__和constructor
proto 每一个Javascript对象(除了 null )都具有的一个属性,叫
__proto__
,这个属性会指向了
建立该对象的组织函数
的原型。
console.log(f1._proto_ === Foo.prototype) // true
constructor
每一个原型都有一个 constructor 属性指向关联的组织函数
因为实例对象能够继续原型对象的属性,所以实例对象也具有constructor属性,一样指向原型对象对应的组织函数。
console.log(Foo.prototype.cOnstructor=== Foo);//true
console.log(f1.cOnstructor=== Foo);//true
console.log(f1.hasOwnProperty('constructor'));//false
原型链
JS在建立对象(不论是一般对象照样函数对象)的时刻,都有一个叫做__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。以上面的例子为例:
console.log(fo.__proto__ === Foo.prototype) //true
一样Foo.prototype也有proto属性
console.log(Foo.prototype.__proto__ === Object.prototype) //true
Object.prototype对象也有proto属性,但它比较特别,为null
console.log(Object.prototype.__proto__ === null)
我们把这个有proto串起来的直到Object.prototype.proto为null的链叫做原型链。原型链的构成是真恰是靠proto 而非prototype
总结
更多文章请前去语雀