Javascript中继承建模的优缺点?
我意识到Javascript没有类,也不是为了有经典的OOP继承而构建的。但我发现这样的模式非常有用,所以我想构建一种简单的方法来建模这种行为,理想情况下,同时利用Javascript的灵活性的最佳部分。以下方法的优缺点是什么 我的自定义库中有以下功能:Javascript中继承建模的优缺点?,javascript,oop,inheritance,prototype-programming,Javascript,Oop,Inheritance,Prototype Programming,我意识到Javascript没有类,也不是为了有经典的OOP继承而构建的。但我发现这样的模式非常有用,所以我想构建一种简单的方法来建模这种行为,理想情况下,同时利用Javascript的灵活性的最佳部分。以下方法的优缺点是什么 我的自定义库中有以下功能: function inherit(superClass, args, instance) { var subClass = inherit.caller; var o = new superClass(args); fo
function inherit(superClass, args, instance) {
var subClass = inherit.caller;
var o = new superClass(args);
for(p in o) {
if(o.hasOwnProperty(p)) init(instance, p, o[p]);
else init(subClass.prototype, p, o[p]);
}
}
function isUndefined(x) {var u; return x === u;}
// sets p to value only if o[p] is undefined
function init(o, p, value) {if(isUndefined(o[p])) o[p] = value;}
此设置需要两个约定:
SubClass.prototype=new SuperClass()方法对我更有用。其他方法,比如dojo的类建模,要复杂得多,我认为这是不必要的
那么,告诉我你的想法。如果其他人以前做过,请告诉我,我不打算重复任何想法。您可能想看看John Resig在JavaScript继承方面做了什么:
这是我见过的对Javascript继承的最好尝试。你知道你所发布内容的缺点。。。。因此,在我的博客中,我对我认为最好的方式进行了透彻的解释,同时描述了其他模式的缺陷
例如:
//Abstraxct base class
function Animal(name) {
this.name = name;
}
Animal.prototype.sayMyName = function () {
console.log(this.getWordsToSay() + " " + this.name);
}
Animal.prototype.getWordsToSay = function () {} // abstract
// --------------------------------
function Dog(name) {
// Call the parent's constructor
Animal.call(this, name);
}
extend(Dog, Animal, {
getWordsToSay: function(){
return "Ruff Ruff";
}
});
我发布的代码是一个示例语法。博客文章详细介绍了如何添加语法糖
重要的是:
- 新狗(“小姑娘”)动物实例//正确
- 调用Animal构造函数不仅仅是为了设置继承
- var dog=新狗(“Lassie”);Animal.prototype.blah=5;dog.blah==5//输出为真
来这里看javascript继承的简单且可能是最好的方法的人,请阅读以下内容,它比我浏览过的所有其他内容都要简单得多:
注意:Object.create现在是较新浏览器中javascript的一部分,但通过添加上述内容,以下内容也适用于较旧的浏览器
newObject = Object.create(oldObject);
请记住,调用者
是非标准的,访问它会在严格模式下抛出错误ES5M我最喜欢的解决方案是coffeescript!
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);