2014-08-28 45 views
1

几天前,我看到一个例子比较对象的实例和他们的方法返回true或false,我试图通过我自己做到这一点。我,如果我声明中对象的方法,而不是在他的原型,它必须在这个例子返回假的,但我得到真正:在这种情况下,java脚本中对象方法的比较返回false

function Foo(name, lastName) { 
    this.name = name, 
    this.lastName = lastName, 
    this.show = function() { 
     return this.name; 
    } 
} 

function Foo2(name, lastName) { 
    Foo.apply(this, arguments); 
} 

Foo2.prototype = Foo.prototype; 
Foo2.prototype.constructor = Foo2; 

var x = new Foo2("Peter", "Pan"); 
var y = new Foo2("John", "English"); 

console.log(x.show() === y.show());// true, why not false? it is two differed functions 

当我对它们进行比较,结果是真实的,但我可以”不明白为什么? 如果我在对象内部声明属性并执行新对象,我创建了两个不同的函数,并且当我在原型中声明时,它创建了一个相等的函数。

感谢您的任何建议。

+0

你没有比较功能,你正在比较功能返回。 – Barmar 2014-08-28 21:05:17

+0

和我可以比较它们的功能? – Victorino 2014-08-28 21:06:10

+1

函数调用函数后放置'()'。使用不带'()'的名称:'console.log(x.show === y.show))'。 – Barmar 2014-08-28 21:07:20

回答

1

您正在调用函数并比较它们的返回值,而不是函数本身。为了引用这些功能本身,请使用后面没有()的名称。

var x = new Foo2("Peter", "Pan"); 
var y = new Foo2("Peter", "English"); 

console.log(x.show() === y.show()); // true 
console.log(x.show === y.show); // false 
+0

感谢您的帮助。 – Victorino 2014-08-28 21:15:34

+0

@HMR在我的例子中没有约翰。我改变了这个问题的例子,因为当他声称它返回'true'时它返回'false'。 'show'函数是不一样的,因为它不在原型中,它是在构造函数中新创建的闭包。 – Barmar 2014-08-28 23:23:41