如何让Javascript“isPrototypeOf”函数返回true?

时间:2016-08-05 10:14:33

标签: javascript prototype

我正在尝试使用此功能来查看不同的对象是否彼此存在关联,所以我尝试了:

var o={name:'abc'};
var o2=o;
console.log(o.isPrototypeOf(o2));
console.log(o2.isPrototypeOf(o));

嗯,它打印2个谬误。我觉得很奇怪,“prototype”是每个函数/对象的属性/函数,所以JS如何判断一个对象是否是另一个对象的原型?

我也尝试过:

var Person=function(){
    name='abc',
    age=30
};
var o1=new Person();
var o2=new Person();
console.log(o1.isPrototypeOf(o2));
console.log(o2.isPrototypeOf(o1));

再次,它打印2个谬误,而我期待2个真实。

2 个答案:

答案 0 :(得分:1)

要使o成为o2的原型,o2对象需要从原型为o的构造函数构造。换句话说,o2需要正确继承 o

为变量分配一个对象或两个对象是相似的是不够的。一个对象必须从另一个对象继承。

所以在经典意义上,这必须发生:

var o = {};
var OConstructor = function () {};
OConstructor.prototype = o;

var o2 = new OConstructor();

o.isPrototypeOf(o2); // true

在现代代码中,您还可以使用Object.create()继承:

var o = {};

var o2 = Object.create(o); 

o.isPrototypeOf(o2); // true

答案 1 :(得分:0)

var o2=o o2指向o后。因此oo2指向同一个对象。是o原型吗?不是o2原型吗?再也不会了。

第二部分o1不是o2的原型。 试着打电话

console.log(Person.prototype)

您将看到Person实例的原型对象(它不是Person函数的原型)。

您也可以使用obj.__proto__查看obj的原型。这是隐藏的财产。最好不要在生产中使用它。