2016-02-08 81 views
-2

尝试理解下面的输出 - 为什么直接在对象上使用时检查是错误的 - 但是在实例上检查时为true?有人可以解释 - 我错过了什么吗?js中的构造函数

function Book2(){ 
    this.title = "High Performance JavaScript"; 
    this.publisher = "Yahoo! Press"; 
}; 

Book2.prototype.author = "hgghghg"; 

var b = new Book2(); 

alert(Book2.hasOwnProperty("title")); //false 
alert(Book2.hasOwnProperty("toString")); //false 
alert("title" in Book2); //false 
alert("toString" in Book2); //true 


alert(b.hasOwnProperty("title")); //true 
alert(b.hasOwnProperty("toString")); //false 
alert("title" in b); //true 
alert("toString" in b); //true 
+1

*“为什么直接在对象上使用时检查是错误的 - 检查实例时是否为真”* - 实例*是*对象。函数是对象。原型也是一个对象。但它们不是同一个对象,并且它们并不都具有相同的属性。 – nnnnnn

回答

0

hasOwnProperty不看原型链中,运营商in确实

此外,Book是一个函数,它没有自己的属性,它继承像applycall方法。使用new创建Book的实例将创建一个对象,其原型链以Book.prototype开头,因此它将看到像title这样的属性。

+0

函数没有属性?请你澄清一下..我是在这里假设Book2会有属性。 – user3645936

+0

不,当你调用'a = new Book()'时,会继承什么,'a'会继承'Book.prototype'中的属性。 'Book'不会继承自'Book.prototype' –

+0

为什么Book2必须继承 - 例如'title' - 它已经存在 - 所以当我做'Book2.hasOwnProperty(“title”)'为什么这是错误的? – user3645936

1

Book2没有title属性,它只在new对象上设置标题属性。 Book2确实从其原型继承toString方法。

hasOwnProperty,顾名思义,告诉你这个特定的对象本身是否具有给定的属性。它确实不是看看原型。
in告诉你物体是否具有的任何位置,包括其原型链。

+0

实际上只是改变了主题 - 我的问题是 - 当我在Book2和b上使用这些属性 - 为什么结果不同。 – user3645936

+1

错误,相同的答案...!? – deceze