簡體   English   中英

object.create如何在JavaScript中工作?

[英]How does object.create work in JavaScript?

告訴我,如果我錯了:

原型是普通對象。 當一個對象繼承原型時,它不僅僅復制原型的屬性,該對象存儲對原型的引用。

在Firefox中,我可以這樣做:

var food = {fruit:"apple"};
var more_food = {vegetable:"celery"};
food.__proto__ = more_food;
food.vegetable // celery
food.fruit // apple

我可以使用__proto__屬性手動設置對原型對象的引用。

我也可以使用Object.create

var food = {fruit:"apple"};
var more_food = {vegetable:"celery"};
food = Object.create(more_food);
food.vegetable // celery
food.fruit // undefined

Object.create究竟在做什么? 變量食物是否分配了對原型more_food的引用,或者是Object.create只返回對象的副本more_food? 如果Object.create只是制作副本,那么如果變量食物沒有引用more_food,原型鏈如何工作?

原型是普通對象。 當一個對象繼承原型時,它不僅僅復制原型的屬性,該對象存儲對原型的引用。

你是對的,一個對象的原型,只是通過原型鏈引用的另一個對象。

你的兩個片段之間的區別在於__proto__你正在改變 food的原型。 在你的第二個例子中,你只是指定一個繼承自more_food的新對象,這就是為什么food.fruit被解析為undefined的原因,因為你的原始food對象被該賦值丟失

Object.create究竟在做什么?

Object.create構建一個新對象 ,該對象繼承自作為其第一個參數傳遞的對象(它可以只是一個對象或null )。

變量食物是否分配了對原型more_food的引用,或者是Object.create只返回對象的副本more_food?

你的food變量將保存一個新對象,它繼承自more_food ,在這個操作中沒有任何復制。

例如:

var food = {fruit:"apple"};
var more_food = Object.create(food, {
  vegetable: { value: "celery" }
});

more_food.fruit;     // "apple"
more_food.vegetable; // "celery"

在上面的例子中, more_food繼承自food ,換句話說, foodmore_food的原型,這種原型參考存儲在一個名為[[Prototype]]的內部屬性中。 Object.create的第二個參數允許您初始化此新對象的屬性。

沒有復制,只是上面例子中的普通委托 more_food.fruit可以通過原型鏈訪問,屬性查找過程非常簡單,如果在對象上找不到屬性,它會再次查找(委托!)對象的原型,遞歸地,直到找到原型為null的對象(如Object.prototype )。

所以, more_food.fruit是一個繼承的屬性:

more_food.hasOwnProperty('fruit'); // false, inherited
'fruit' in more_food;              // true

雖然vegetablemore_food自有財產

more_food.hasOwnProperty('vegetable'); // true

上面的例子看起來像這樣:

+---------------------+  [[Prototype]]  +---------------+
  | more_food           |+--------------->| food          |
  |---------------------|                 |---------------|
  | vegetable: "celery" |                 | fruit: "apple |
  +---------------------+                 +---------------+

如果Object.create只是制作副本,那么如果變量食物沒有引用more_food,原型鏈如何工作?

Object.create不會創建對象的副本,它只是在創建新對象時設置它的原型。

請記住, __proto__是一個非標准功能,它將來會從實現中刪除,已經在Mozilla文檔中被列為已棄用 ,這是其主要原因,這也是該語言可能永遠不會有的原因。以__proto__的方式改變原型鏈的方法是,它會導致VM和JIT級別的優化和安全問題。

暫無
暫無

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

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