在JavaScript中更改对象的类型
-
02-10-2019 - |
题
我有一系列用JSON定义的现有对象。对象显然是对象类型的。如何将它们与自定义对象类型相关联以赋予它们特定的功能?
解决方案
在所有浏览器中都可以使用的方式是使用所需的属性和方法在数组中增加每个项目,或者将对象传递给构造函数,并基于旧对象的属性和方法创建新对象。
或者,如果您不在乎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();
其他提示
我认为,一旦创建对象,就不会有任何方法可以更改其类型。幸运的是,您实际上可能不需要更改对象的类 - 您可能会满足对象一些新方法和其他功能。 (唯一真正的区别是如果您更改课程将会发生,并且大多数人在代码运行时不会更改类。)
我会为你做一个例子。首先,我将创建一个简单的对象来表示您拥有的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()
执行给我信息”你好,莎莉“。不幸的是,您不想要一个新对象(就像 s
)使用此功能,您需要现有对象(myobj
)这是您的方式:
myobj.speak = s.speak
现在,当我执行此操作时:
myobj.speak()
我看到了消息”你好,弗雷德".
总结: 创建一个可以执行您想要的对象。将所有方法(和任何辅助变量)复制到您的新对象中。除了对继承的某些异常用途外,这将使您的新对象根据需要行事。
如果您不需要构造函数,则可以做:
Object.assign(new CustomType, {});
如果您想在他们上使用特定方法,则可以使用apply/呼叫。
或者,您可以复制自定义对象的方法。
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
作为对杰里米答案的补充,您可以使用对象。创建而不是直接玩 原始. 。您还需要“扩展”功能。
因此,考虑到杰里米的例子,您可以拥有这样的东西:
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();
不隶属于 StackOverflow