在javascript中启用OOP的简单方法是什么?

在javascript中启用OOP的简单方法是什么?,javascript,performance,oop,Javascript,Performance,Oop,更新 自从我提出这个问题以来,很多水都流入了河中,我已经改用模块模式和CommonJS file format+,不再试图让Javascript更像一种OOP语言。我已经接受了Javascript原型继承和对象。创建我现在的生活比以往任何时候都好!,是的,我几乎感觉我加入了一个新的宗教,对不起,一个宗教。。。在JS中,我再也没有“新”了 剩下的问题只是历史 我在javascript中使用OOP已经有一段时间了 老实说,我的感觉是,大多数时候,真正的OOP是不需要的。我以前用OOP在其他语言中所

更新

自从我提出这个问题以来,很多水都流入了河中,我已经改用模块模式和CommonJS file format+,不再试图让Javascript更像一种OOP语言。我已经接受了Javascript原型继承和
对象。创建
我现在的生活比以往任何时候都好!,是的,我几乎感觉我加入了一个新的宗教,对不起,一个宗教。。。在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级的继承。