[英]How do I assign a prototype to an object literal?
我使用JSON序列化了一些數據,我必須將普通對象變回“類”。 我試過這個:
function Location() {}
Location.prototype.getX = function() {
return this.x;
};
var p = {x: 3, y: 5};
p.prototype = new Location();
console.log(p.getX());
但是我得到一個錯誤,即getX
未定義。 有沒有辦法使這項工作或我將不得不構建一個新的Location
並手動從對象復制屬性?
根據您的瀏覽器支持需求,您可以使用Object.create
來實現此目的:
function Location() {}
Location.prototype.getX = function() {
return this.x;
};
var p = Object.create(Location.prototype);
p.x = 3;
p.y = 5;
console.log(p.getX()); // 3
我認為這也更清楚地說明了你的意圖,並且其他方法如使用__proto__
已被棄用,並且可能在不久的將來從瀏覽器中消失。
文檔(和polyfill)可以在這里找到: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
編輯
Object.create是最好的方法,因為它允許在運行時擴展原型並傳遞instanceof
測試
Location.prototype.print = function() {
console.log("modifying the prototype at runtime should work");
}
// p gets print method from prototype chain
p.print();
// true with Object.create
p instanceof Location;
prototype
對象是構造函數(函數)的屬性。 在你的情況下,你應該使用__proto__
:
function Location() {}
Location.prototype.getX = function() {
return this.x;
};
var p = {x: 3, y: 5};
p.__proto__ = new Location();
console.log(p.getX()); // 3
看看這些MDN文章:
如BERGI所述, __proto__
是非標准功能,因此MDN建議使用getPrototypeOf和setPrototypeOf (不支持還)的方法。
由於setPrototypeOf
支持setPrototypeOf
,我建議您手動將Location
實例中的所有屬性復制到p
:
function Location() {}
Location.prototype.getX = function() {
return this.x;
};
var p = {x: 3, y: 5};
var l = new Location();
for (var k in l) {
p[k] = l[k];
}
console.log(p.getX());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.