Javascript 如何将原型分配给对象文字?

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是未定义的。是否有办法使此工作正常,或者我必须构造一个新的位置并手

我已经使用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
是未定义的。是否有办法使此工作正常,或者我必须构造一个新的
位置
并手动从对象复制属性?

原型对象是构造函数(函数)的属性。在您的情况下,您应该使用
\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文章:

编辑 正如Bergi所说,
\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]