我有一个用JSON定义的现有对象数组。对象显然是Object类型。如何将它们与自定义对象类型相关联以为其提供特定功能?
答案 0 :(得分:12)
在所有浏览器中工作的方式是使用所需的属性和方法扩充数组中的每个项目,或者将对象传递给构造函数并基于旧对象的属性和方法创建新对象。
或者如果你不关心IE:
var obj = {
name : "Jeremy"
};
function CustomType() {
this.name = this.name || "someValue";
this.greeting = "Hi";
}
CustomType.prototype.sayHi = function() {
alert(this.greeting + ", " + this.name);
};
obj.__proto__ = CustomType.prototype;
obj.constructor.call(obj);
obj.sayHi();
答案 1 :(得分:4)
我不相信有任何方法可以在创建对象后更改对象的类型。幸运的是,您可能实际上并不需要更改对象的类 - 您可能会对为对象提供一些新方法和其他功能感到满意。 (唯一真正的区别是如果你改变了类会发生什么,并且大多数人在代码运行时不会改变类。)
我会为你做一个例子。首先,我将创建一个简单的对象来表示您拥有的JSON对象:
var myobj = new Object()
myobj.name = "Fred"
然后我将创建一个您希望能够分配给myobj
的课程:
function Speaker() {
this.speak = function() {
window.alert("Hello, " + this.name);
}
}
这个新的Speaker
类有一些有用的功能:它可以使用方法speak()
来输出有用的信息:
var s = new Speaker()
s.name = "Sally"
s.speak()
执行该消息给了我“ Hello,Sally ”的消息。不幸的是,您不希望具有此功能的NEW对象(如s
),您希望现有对象(myobj
)拥有它。这是你如何做到的:
myobj.speak = s.speak
现在执行此操作时:
myobj.speak()
我看到消息“ Hello,Fred ”。
总结一下:创建一个符合您需要的对象。将所有方法(以及任何辅助变量)复制到新对象中。除了继承的一些不寻常的用途之外,这将使您的新对象按照需要运行。
答案 2 :(得分:3)
如果您不需要构造函数,则可以执行以下操作:
Object.assign(new CustomType, {});
答案 3 :(得分:2)
如果您想对它们使用特定方法,可以使用apply / call。
或者您可以复制自定义对象的方法。
function Object1() {
this.aValue = "10";
}
function CustomObject() {
this.customValue = "6";
}
function convertToCustom(obj) {
var custom = new CustomObject();
for( var key in obj ) {
custom[key] = obj[key];
}
return custom;
}
var obj = new Object1();
var custom = convertToCustom(obj);
console.log(custom.customValue); // <- 6
console.log(custom.aValue); // <- 10
答案 4 :(得分:1)
作为Jeremy答案的补充,您可以使用Object.create而不是直接使用 proto 。你还需要一个“扩展”功能。
所以,根据Jeremy的例子,你可以有类似的东西:
var obj = {
name : "Jeremy"
};
function CustomType() {
}
CustomType.prototype.init = function(){
this.name = this.name || "someValue";
this.greeting = "Hi";
return this; //let's make it fluent
}
CustomType.prototype.sayHi = function() {
console.log(this.greeting + ", " + this.name);
};
function extend(obj, props) {
for(prop in props) {
if(props.hasOwnProperty(prop)) {
obj[prop] = props[prop];
}
}
return obj; //let's make it fluent
}
obj = extend(Object.create(CustomType.prototype), obj).init();
obj.sayHi();