[英]Is `new` in JavaScript just syntactic sugar for `.call`?
在JavaScript中,我想知道是否有關於new
特殊內容,或者它是否只是call()
語法糖。 如果我有一個像這樣的構造函數:
function Person ( name, age ){
this.name = name;
this.age = age;
}
是
var bob = new Person( "Bob", 55 );
任何不同的
var bob;
Person.call( bob = new Object(), "Bob", 55 );
?
它們在您的示例中不等效,因為bob
不從Person.prototype
繼承(它直接從Object.prototype
繼承)。
等效版本將是
Person.call(bob = Object.create(Person.prototype), "Bob", 55 );
是語法糖嗎? 可能取決於您如何定義它。
Object.create
在早期的JS版本中不可用,因此不能在沒有new
情況下設置對象繼承(你可以在某些瀏覽器中覆蓋對象的內部__proto__
屬性 ,但這是非常糟糕的做法)。
作為參考,如何在http://es5.github.com/#x11.2.2和http://es5.github.com/#x13.2.2中定義new
工作。 Object.create
在http://es5.github.com/#x15.2.3.5中描述。
不, new
的不僅僅是語法糖。 相反, Person.call
可以(並且只能工作)構造一個新實例,因為JavaScript允許在某些情況下調用構造函數而不使用new
。
沒有。
call()
只調用一個函數(另請參見apply()
),而new
關鍵字初始化一個原型的對象。
雖然原型構造函數確實是一個函數,但它是一個特例。
不,這不對。 如果是第一個例子,那么您實際上是在創建一個Person。
bob instanceof Person == true
在另一個例子中......
bob instanceof Person == false
創建類型實例的關鍵是分享一些行為,通常是通過原型。
假設您添加了一個函數:
Person.prototype.doSomething = function(){
...
}
然后,此函數將可用於使用new
創建的Person
實例的所有對象,但不能用於使用call
創建的對象。
MDN有一個關於原型使用的好的介紹性文件 。
當您調用new
,您將該函數作為構造函數調用。 這告訴JavaScript,以便使一個“新” Person
的對象,然后調用設置為新對象的函數this
。
在你的第二個例子中,你通常調用該函數,並手動設置this
為new Object
(或只是{}
因此,該函數運行,並設置您發送它的this
對象的屬性。 (嘗試做人Person( "Bob", 55 );
然后是console.log(window.name)
)
在第一個例子中, bob
是一個Person
對象; 但在第二天,它是一個Object
。
所以,不,一個人對另一個人來說並不缺乏。 他們是不同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.