我使用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
并手动从对象复制属性?
答案 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建议使用getPrototypeOf和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());