首先,我试过
var o = {};
var Derived = function () {}
Derived.prototype = o;
var o2 = new Derived();
console.log(o.isPrototypeOf(o2));
打印" true"
然后我尝试了如下函数表达式:
var o = function(){}; //difference 1
var Derived = function () {}
Derived.prototype = new o();
var o2 = new Derived(); //difference 2
console.log(o.isPrototypeOf(o2));
打印" false"
我想两者都是
"o={}" declares an object
"new o()" declares an object.
但为什么他们的最终结果不同?
答案 0 :(得分:2)
这是因为在将对象分配给变量时,您需要按引用标记,这意味着 Derived.prototype 等于<即使在您将 o 分配给 Derived.prototype 之后,强> o 。它是对象 o 的引用,这就是为什么在验证原型时会得到真实的原因,因为 Derived.prototype (这是真正的原型)等于<强> 0 即可。
当您使用新时,您将再创建一个不再 o 的新对象。 o 只是构造函数,允许创建此新对象。所以 o 不是原型, o 和 Derived.prototype 是不一样的。 o.prototype 是原型。您可以通过这种方式简化示例,以确定真正的差异:
x = {};
y = x;
console.log(x === y);
VS
x = function(){};
y = new x();
console.log(x === y, x.prototype.isPrototypeOf(y));
答案 1 :(得分:0)
在第一个例子中,o是一个具体的js对象,它由类似于new Object()
的机制创建
而在第二个例子中,它是一个函数表达式。它与普通的js对象不同。
此外isProtoType
调用您正在使用o
作为函数对象。不是具体的。而o2
是一个具体的对象,而不是一个函数对象。