在javascript中启用OOP的简单方法是什么?
更新 自从我提出这个问题以来,很多水都流入了河中,我已经改用模块模式和CommonJS file format+,不再试图让Javascript更像一种OOP语言。我已经接受了Javascript原型继承和在javascript中启用OOP的简单方法是什么?,javascript,performance,oop,Javascript,Performance,Oop,更新 自从我提出这个问题以来,很多水都流入了河中,我已经改用模块模式和CommonJS file format+,不再试图让Javascript更像一种OOP语言。我已经接受了Javascript原型继承和对象。创建我现在的生活比以往任何时候都好!,是的,我几乎感觉我加入了一个新的宗教,对不起,一个宗教。。。在JS中,我再也没有“新”了 剩下的问题只是历史 我在javascript中使用OOP已经有一段时间了 老实说,我的感觉是,大多数时候,真正的OOP是不需要的。我以前用OOP在其他语言中所
对象。创建我现在的生活比以往任何时候都好!,是的,我几乎感觉我加入了一个新的宗教,对不起,一个宗教。。。在JS中,我再也没有“新”了
剩下的问题只是历史
我在javascript中使用OOP已经有一段时间了
老实说,我的感觉是,大多数时候,真正的OOP是不需要的。我以前用OOP在其他语言中所做的事情,大多数时候都可以用javascript中的函数和闭包来完成
同样,为了模仿OOP方法,有很多方法可以实现它,要么手工制作,要么使用一个很小的库
我想尝试一下OOP,但我发现的所有解决方案,对我来说都并没有那个么简单,有些要求我添加一个init方法,或者在初始化过程中,他们正在对函数进行特殊检查,以了解是否需要重写它们。虽然这很聪明,但对于简单地从类创建对象来说似乎有点过分
所以我提出了这个解决方案:
更新:这是一个实验,不打算取代任何优秀的现有库或用于生产
var Nexus = function() {}; // helper function to avoid create an instance of the child class
Object._extend = function(child, parent) {
var base = Nexus.prototype = parent.prototype;
child.prototype = new Nexus();
var cp = child.prototype;
cp.constructor = child;
child._parent = base;
};
/* THIS THEN IS USED LIKE THIS */
var Person = function (name) {
this.name = name;
console.log('Person constructor');
};
$.extend(Person.prototype, {
walk : function () {
console.log(this.name + ' is Walking!!');
}
});
var Student = function () {
// call the base class constructor
Student._parent.constructor.apply(this, arguments);
console.log('Student Constructor');
}
Object._extend(Student, Person);
$.extend(Student.prototype, {
walk : function () {
console.log(this.name + ' walks like Student');
//calling a parent method
Student._parent.walk.apply(this, arguments);
}
});
var p = new Person('Jon Doe');
p.walk();
console.log(p instanceof Person) // true
var s = new Student('Joan Doe');
s.walk();
console.log(s instanceof Person) // true
console.log(s instanceof Student) // true
如您所见,这种方法满足了OOP的要求。
子对象既是父类的实例,也是子类的实例
子obj可以调用父类的方法来访问重写的方法。(与CurrentClass.\u parent和BaseClass.prototype的唯一区别是,第二个要求类的使用者实际知道父类的名称,这是我想要避免的)
创建构造函数必须很简单,在这种情况下。。。函数本身就是构造函数。不需要简单的初始化方法。。。在实例化期间自动调用的
我采用的方法中的缺点:
我需要一个虚拟类Nexus(我真的不喜欢只为了让继承链正常工作而实例化基类的对象……Nexus就是这样做的)
我没有在正确设置上下文的情况下提供对重写方法的访问。消费者可以使用call或apply更改上下文
使用额外的Nexus虚拟函数来创建正确的原型链是否是内存管理的问题?
我还没有时间做适当的测试,我的继承链不超过3级。因此,那里的影响似乎很小
我本来可以使用一个库来实现这一点,但是直接创建它并在构造函数中添加一些代码似乎非常简单,我没有看到使用额外的init类进行初始化的好处
您认为添加虚拟Nexus函数会有什么显著的影响
是否有额外的Nexus虚拟函数来创建正确的原型链是内存管理的一个问题
不,你只是在内存中有一个(一个!)额外的对象。将其移动到对象中。_extend
函数,它甚至会自动进行垃圾收集
但是,您应该直接使用Nexus,而不是Nexus。另请参见。在我看来,您直觉上认为面向对象JavaScript有点不合适是正确的。是的,我这样做更多的是为了实验,而不是为了实际使用。这就是我问的原因。谢谢你的帮助feedback@Point谢谢你!最后,有人不同意JavaScript是OOP,因为它不是,它只是在玩范围。如果您需要隐藏数据,请使用模块模式,不要发疯@royriojas,许多现有的库都做类似的事情。没有必要自己动手。问题到底是什么?“What do you think”感谢您的反馈,并且肯定会尝试使用Object。对于实验,您不需要填充它:-)只需将其链接起来,以帮助理解代码为什么也能工作。请参见,对象创建是否只创建新对象?因此,这与从预定义类创建新对象不同。这在任何情况下都是好的,因为我几乎不需要说我需要超过3级的继承。