簡體   English   中英

JavaScript中的`new`只是`.call`的語法糖?

[英]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.2http://es5.github.com/#x13.2.2中定義new工作。 Object.createhttp://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

在你的第二個例子中,你通常調用該函數,並手動設置thisnew Object (或只是{} 因此,該函數運行,並設置您發送它的this對象的屬性。 (嘗試做人Person( "Bob", 55 );然后是console.log(window.name)

在第一個例子中, bob是一個Person對象; 但在第二天,它是一個Object

所以,不,一個人對另一個人來說並不缺乏。 他們是不同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM