javascript原型观点(一)

这里,我们列出原型的几个观点,以下:

  • 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]]属性。

弄清楚了这些观点,原型链,继续等存在的一些问题,都不是问题了。

《javascript原型观点(一)》

    原文作者:52lidan
    原文地址: https://segmentfault.com/a/1190000000532556
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞