Javascript原型检查区分"功能声明"使用"函数表达式",为什么?

时间:2016-08-08 02:01:08

标签: javascript function expression prototype declaration

首先,我试过

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.

但为什么他们的最终结果不同?

2 个答案:

答案 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是一个具体的对象,而不是一个函数对象。