在尝试了js的原型继承之后,我发现我并不认为必须在对象之外声明我的对象的方法:
function obj(){
this.averyday='i\'m shuffle\'n';
this.gibmo='dinero';
this.pullOut='that\'s what she said lol';
}
obj.prototype.alertProp=function(){
alert(this.averyday);
}
obj.prototype.alertProp2=function(){
alert(this.gibmo);
}
所以我提出了一种将方法组织成一个命名空间的方法
obj.prototype.m={
//i'm passing in the object instance so the mathods can have access to it's properties
alertProp:function(that){
alert(that.theObj.everyday);
},
alertProp2:function(that){
alert(that.myObj.gibmo+' '+that.myObj.someVal); // alerts "dinero some other value to be use "
}
}
var myobj = new obj;
然后使用我只需调用方法并传入对象实例(如果方法需要修改对象的属性)
myobj.m.alertProp({theObj:myobj,someVal:'some other value to be use'}) //alerts "i'm shuffle'n"
所以这里有一些我注意到的专业人士:
优点:
1)将方法组织到一个集中区域。
2)仅访问对象的“原型”一次(实际上使用较少的代码)。
3)似乎更具可读性(至少对我而言)。
缺点:......这是我需要你帮助的地方,有人看到这样做有什么不妥吗?任何表现问题或我所概述的专业人士的任何错误等......?
也有人看到我可能没有看到或不明显的任何其他专业人士吗?
答案 0 :(得分:1)
我发现它有点复杂,我喜欢这样做:
MyObject = function (options) {
this.init(options);
};
MyObject.prototype = {
/**
* Documentation
*/
variable1: null,
init: function (options) {
// do something with options.
},
alertVariable: function () {
alert(this.variable1);
}
};
所以你不必担心发送额外的参数,你只需要调用它。
---------------------------- EDIT ------------------ ---------------
好吧,我不知道我是否做对了,但经过一些阅读后我相信这会“修复构造函数”的意思。如果我创建这样的对象:
Foo = function () {
// Do something
};
然后Foo.prototype.constructor == Foo
,正如人们所期望的那样。
我的方法(感谢Raynos)的问题在于,当我这样做时:
Foo.prototype = {...};
我覆盖了所有Foo的原型,所以Foo.property.constructor != Foo
,这不是我们所期望的!而不是我们Foo.property.constructor == Object.prototype.constructor
。
那么,我们如何解决它?
Foo.prototype = {
constructor: Foo, // <-- FIXED!
...
};
Ta da!
(这有很大帮助:http://beej.us/blog/data/javascript-prototypes-inheritance/)