这里,我们列出原型的几个观点,以下:
- prototype属性
- [[prototype]]
__proto__
<!–more–>
prototype属性
只需建立了一个函数,就会为该函数建立一个prototype
属性,指向该函数的原型对象。实例对象是不会具有该属性的。
默许情况下,该原型对象
也会取得一个constructor
属性,该属性包括一个指针,指向prototype
属性地点的函数。
function Person() {}// 只是一个函数罢了
Person.prototype.constructor === Person
[[prototype]]和__proto__
javascript中,不能够接见的内部属性都是用[[propertyName]]
这类情势来示意的,比方另有罗列属性[[Enumberable]]。
[[prototype]]
属性只能是对象能够具有的属性。比方实例化的对象以及原型对象
,而不是组织函数。这个属性指向具有其属性的对象的组织函数的原型对象。注重,此处的组织函数
指的是运用new
体式格局的组织函数。并不因为更改了原型对象上的constructor
属性而转变。
比方:
function Person() {}
Person.prototype.constructor = {}; // 此处修改了Person原型的组织函数指向
let p = new Person();
p.__proto__ === Person.prototype; // true
__proto__
是个啥呢,就是对[[propertyName]]
的完成。也就是说,你能够在支撑该完成的浏览器下(FF,chrome,safari),去接见对象的组织函数的原型对象。比方:
var Person = function(name) {
this.name = name;
};
var p1 = new Person();
p1.__proto__=== Person.prototype; // true
Person.prototype = {};
var p2 = new Person();
p2.__proto__ === Object.prototype; // false
固然,__proto__
只是浏览器的私有完成,现在ECMAScript规范完成要领是Object.getPrototypeOf(object)
。
var Person = function(name) {
this.name = name;
};
var p1 = new Person();
Object.getPrototypeOf(p1) === Person.prototype; // true
Person.prototype = {};
var p2 = new Person();
Object.getPrototypeOf(p2) === Object.prototype; // false
别的一种推断实例对象和其原型对象存在指向关联(由实例的[[prototype]]指向其组织函数的原型对象)的要领是:isPrototypeOf
。比方:
Person.prototype.isPrototypeOf(p1); // true
因为函数和原型对象
也是一个对象,所以,它自然而然也具有[[prototype]]
属性。
弄清楚了这些观点,原型链,继续等存在的一些问题,都不是问题了。