深入理解JavaScript的原型属性与两个方法Object.getPrototypeOf与isPrototypeOf

作者:admin     字体:[增加 减小]    类型:原创
本文重点讲解了对象的原型属性与两个方法`Object.getPrototypeOf()`与`isPrototypeOf`,有不明白的请留言。

JavaScript中对象的原型属性是用来继承属性的,原型属性是在实例对象创建之初就设置好的。

通过对象直接量创建的对象使用Object.prototype作为它们的原型。通过new创建的对象使用构造函数的prototype属性作为它们的原型。通过Object.create()创建的对象使用第一个参数(也可以是null)作为它们的原型。如果对这三种方法创建对象不太清楚,请查看本站原创文章《JavaScript中创建对象的三种方法,重点讲解新方法Object.create()》。

在ECMAScript5中,将对象作为参数传入Object.getPrototypeOf()可以查询它的原型。比如

/*
    示例的结果在//之后
*/

//空对象
var o = new Object();
console.log(Object.getPrototypeOf(o));  //Object{}

//字符串对象
var d = new String('string');
console.log(Object.getPrototypeOf(d));  //String {length: 0, [[PrimitiveValue]]: ""}

//自定义构造函数,通过new来创建实例
function MyClass(){
    alert('abc');
}
var myObj = new MyClass();
console.log(Object.getPrototypeOf(myObj));  //MyClass{}

//通过Object.create()创建对象
console.log(Object.create(null));   //Object{}

Object.getPrototypeOf方法示例

在ECMAScript3中,则没有与之等价的函数,但经常使用表达式o.constructor.prototype来检测一个对象的原型。通过new表达式创建的对象,通常继承一个constructor属性,这个属性指代创建这个对象的构造函数。但使用这种方法来检测对象原型的方式并不可靠。

注意,通过对象直接量接量或Object.create()创建的对象包含一个名为constructor的属性,这个属性指代Object()函数。因此,constructor.prototype才是对象直接量的真正原型,但通过Object.create()创建的对象则往往不是这样。

要想检测一个对象是否是另一个对象的原型(或处于原型链中),可以使用isPrototypeOf()方法。例如,可以通过p.isPrototypeOf(o)来检测p是否是o的原型:

var p = {color:'red'};      //定义一个原型对象
var o = Object.create(p);   //使用这个原型创建一个对象
console.log(p.isPrototypeOf(o));    // =>true,o继承自p
console.log(Object.prototype.isPrototypeOf(o)); // =>true,p继承自Object.prototype

function A(){} 
function B(){} 
B.prototype = new A(); // B继承于A 

var b = new B(); 
console.log(b instanceof A); // true 

isPrototypeOf()函数实例的功能和instanceof运算符非常类似。

本文重点讲解了两个方法Object.getPrototypeOf()isPrototypeOf,有不明白的请留言。