我有一些自定义对象定义,如:
var Class1 = function () { this.value = ''; };
var Class2 = function () { this.data = ''; };
Class1.prototype = {
setObject: function () {
for (var prop in this){
if (typeof obj[prop] != 'undefined')
this[prop] = obj[prop];
}
}
}
Class2.prototype = {
setObject: function () {
for (var prop in this){
if (typeof obj[prop] != 'undefined')
this[prop] = obj[prop];
}
}
}
默认情况下,是否可以将此方法setObject
用于所有clases?
(模拟)从JavaScript中的Object
类型继承该函数是否更好?或者更好地使用全局函数或逐个定义它?
答案 0 :(得分:2)
如果您要使用jQuery或下划线等库,则您已经可以使用弹性extend
方法(请参阅$.extend
和_.extend
),所以我想说没有理由重新发明这些自定义对象类型的轮子。
否则,您可以从公共基类继承Class1
和Class2
:
function BaseClass() {
...
}
BaseClass.prototype = {
setObject: function (obj) {...}
};
function Class1() {
...
}
Class1.prototype = new BaseClass();
function Class2() {
...
}
Class2.prototype = new BaseClass();
var a = new Class1();
a.setObject({...});
var b = new Class2();
b.setObject({...});
或者,如果这些对象不应包含共同的祖先,您可以将它们定义为使用相同的setObject
函数引用:
function setObject(obj) {
...
}
function Class1() {
...
}
Class1.prototype = {
setObject: setObject
};
function Class2() {
...
}
Class2.prototype = {
setObject: setObject
}
答案 1 :(得分:0)
我不确定你是否知道,但Javascript中没有类或方法。只有对象,函数和称为“原型”的特殊属性。
模拟类的常用方法是:
var Class = function () { this.prop = "hi" };
Class.prototype.doMethod = function () { this.prop = "hi2"; };
Class.prototype.setObject: function () {
for (var prop in this){
if (typeof obj[prop] != 'undefined')
this[prop] = obj[prop];
}
}
// those classes "inherit" from Class
var Class1 = function () { Class.call(this); this.value = ''; };
Class1.prototype = new Class();
var Class2 = function () { Class.call(this); this.data = ''; };
Class2.prototype = new Class();
答案 2 :(得分:0)
伊万展示了如何从一个物体继承。有关使用构造函数和继承的更多信息,请访问:Prototypical inheritance - writing up
你也可以使用mixin模式:
var mixIn=function(target,source){
for(fn in source){
if(source.hasOwnProperty(fn)){
target.prototype[fn]=source[fn];
}
}
};
var ObjectSettable = {
setObject: function () {
for (var prop in this){
if (typeof obj[prop] != 'undefined')
this[prop] = obj[prop];
}
}
};
var Class1 = function () { this.value = ''; };
//... Class1.prototype stuff
mixIn(Class1,ObjectSettable);