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

时间:2014-02-07 12:20:24

标签: 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未定义的错误。有没有办法使这项工作或我必须构建一个新的Location并手动从对象复制属性?

2 个答案:

答案 0 :(得分:2)

根据您的浏览器支持需求,您可以使用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;

答案 1 :(得分:1)

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,我建议您手动将所有属性从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());