JavaScript中的 prototype 和 constructor

  prototype属性

    任何js函数均可以用做构造函数, 而构造函数须要用到prototype属性, 所以, 每一个js函数F(除了ES5的Function.bind()方法返回的函数外) 都自动拥有一个prototype属性. 函数

  F.prototype的值是一个对象 o , o 默认包含惟一一个不可枚举的属性: constructor , 值默认指回 F,能够修改.this

  调用 F 构造的对象继承 F.prototype 对象.spa

  F.prototype 是类的惟一标识.  当且仅当两个对象继承自同一个原型对象时, 它们才属于同一个类的实例. 而构造函数只是对象建立好以后, 当成是该对象的方法当即调用一次.不能做为类的标识. 若是两个构造函数的prototype属性指向同一个原型对象, 则它们建立的实例属于同一个类.prototype

function C1(){
    this.y = 1;
}
function C2(){
    this.y = 2;
}
var p = {x:10};
C1.prototype = p;
C2.prototype = p;
var c1 = new C1();
var c2 = new C2();
console.log(c1 instanceof C2); //"true"
console.log(c2 instanceof C1); //"true"

    

  instanceof 运算符检测对象是否属于某个类(名字和构造函数 F 同名)时, 其实是检查是否继承自 F.prototype.  c1 instanceof C1; // 若是 c1 继承自 C1.prototype, 则返回true, 而不是检查c1是否由C1()初始化而来. 而instanceof运算符则强化了构造函数是类的公有标识的概念. code

  js基于原型的继承机制是动态的,建立对象后, 原型的属性发生改变, 也会影响到继承这个原型的全部实例对象.并且也能够修改内置类的原型对象.对象

 

  constructor属性

  F.prototype.constructor 的值为一个函数对象, 默认指向 F 自己.blog

  构造函数 F 是类的 "公共标识",  constructor属性被对象继承下去了, 因此  var obj = new F() 后  obj.constructor 就能找到其构造函数, 也能够说找到了类. 可是修改了  F.prototype  以后, constructor属性也可能改变了, 能够手动修改回来.继承

  

  两者的关系

var F = function(){};
var p = F.prototype;
var c = p.constructor;
console.log(c === F); // "true"

var F = function(){
};
var G = function(){
    console.log("I am G");
};
F.prototype.constructor = G;
var o = new F();
console.log(o.constructor === G); //constructor 属性说明是G, 返回: true
console.log(o.constructor === F); // constructor 属性说明类的构造函数, 如今已经变为G了. 因此: false
console.log(o instanceof F); // o 继承自 F.prototype, 因此是: true
console.log(o instanceof G); // o 不是继承自 G.prototype, 因此是 false

 

  参考: <<JavaScript权威指南: 第6版>>

相关文章
相关标签/搜索