[英]How does Object.create not allow multiple inheritance in 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
,換句話說, food
是more_food
的原型,這種原型參考存儲在一個名為[[Prototype]]
的內部屬性中。 Object.create
的第二個參數允許您初始化此新對象的屬性。
沒有復制,只是上面例子中的普通委托 more_food.fruit
可以通過原型鏈訪問,屬性查找過程非常簡單,如果在對象上找不到屬性,它會再次查找(委托!)對象的原型,遞歸地,直到找到原型為null
的對象(如Object.prototype
)。
所以, more_food.fruit
是一個繼承的屬性:
more_food.hasOwnProperty('fruit'); // false, inherited
'fruit' in more_food; // true
雖然vegetable
是more_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.