对象的原型指向

拭目以待 发布于

创建原型的方式有很多种,通过不同方式创建的对象,它们的原型指向是不相同的。
注:Object.getPrototypeOf()=>查看当前对象的原型,Object.prototype.isPrototypeOf(o)=>o的原型是否是Object.prototype。

通过对象直接量:

var o = {x:1};
console.log(Object.getPrototypeOf(o)); //当前的对象原型为 Object.prototype
console.log(Object.prototype.isPrototypeOf(o)); //true o的原型属性指向Object.prototype,等同于 o.constructor.prototype

通过构造函数:

function fn(){
    this.x = 1;
}
var fo = new fn();
console.log( fn.prototype.isPrototypeOf(fo) );  //true  fo的原型属性是fn.prototype


混合模式下的构造函数:

function fp(){
}
fp.prototype={
    name:'baukh'
    ,age:30
}
var fpo = new fp();
console.log(fp.prototype.isPrototypeOf(fpo)); //true  fpo的原型属性是 fp.prototype

通过new Object():

var no = new Object({});
console.log(Object.prototype.isPrototypeOf(no)); //true  no的原型属性是 Object.prototype

通过new Object()进行继承:

var no2 = new Object(fo);
console.log(fn.prototype.isPrototypeOf(no2)); //true  no的原型属性是 fn.prototype

通过Object.create():

var co = Object.create({});
console.log(Object.prototype.isPrototypeOf(co));       //true  co的原型属性是Object.prototype


通过Object.create()继承:

var co2 = Object.create(o);
console.log(o.isPrototypeOf(co2));       //true  co2的原型属性是o

通过上述测试,得出结论:

      1、通过对象直接量创建的对象,原型对象是Object.prototype。
      2、通过构造函数(包括混合模式),原型对象是构造函数本身的prototype。
      3、通过new Object()、Object.create()创建的对象,在不指定继承对象的情况下,原型对象是Object.prototype,反之原型对象则是所继承对象的原型对象。