Javascript 如何将原型分配给对象文字?
我已经使用JSON序列化了一些数据,我必须将普通对象转换回“类”。我试过这个:Javascript 如何将原型分配给对象文字?,javascript,Javascript,我已经使用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是未定义的。是否有办法使此工作正常,或者我必须构造一个新的位置并手
function Location() {}
Location.prototype.getX = function() {
return this.x;
};
var p = {x: 3, y: 5};
p.prototype = new Location();
console.log(p.getX());
但是我得到一个错误,
getX
是未定义的。是否有办法使此工作正常,或者我必须构造一个新的位置
并手动从对象复制属性?原型对象是构造函数(函数)的属性。在您的情况下,您应该使用\uuuu proto\uuu
:
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文章:
\uuuu proto\uuu
是一个非标准特性,因此MDN建议使用and(目前还不支持)方法
由于还不支持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());
根据您的浏览器支持需要,您可以使用
对象。创建
,其目的正是为了:
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
我认为这也更清楚地说明了您的意图,其他方法,如使用\uuuuu proto\uuuu
已经被弃用,并且可能在不久的将来从浏览器中消失
文档(和polyfill)可在以下位置找到:
编辑
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;
你的回答也很好,但并不完全回答我的问题。如果我要使用
Object.create
,我还不如使用构造函数。我想看看是否有办法避免再次分配成员。公认的答案是再次分配值。考虑到您的用例,我只需要Location
接受一个可选的配置对象,例如newlocation(p)
。不,我目前可以只JSON。解析对象,然后分配\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
就可以了。\uuuuuuuuuuuuuuuuuuuuu。我会编辑我的答案来说明为什么上面的答案是正确的。如果你是对的,我会选择你的答案作为最佳答案。但是,在我的具体情况下,我有一个受控环境(Node.JS+V8),所以我可以使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我会解决的。编辑的代码中有一个错误。应该是p[k]=l[k]代码>