簡體   English   中英

如何將原型分配給對象文字?

[英]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建議使用getPrototypeOfsetPrototypeOf (不支持還)的方法。

由於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.

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