JavaScript中的继承

JavaScript中的继承,javascript,internet-explorer,inheritance,Javascript,Internet Explorer,Inheritance,我正在将一个JavaScript客户端编码为RESTJSONAPI。因为我不想让它依赖于任何其他库,所以我使用的是香草javascript 一切都很好,但我在IE中的继承方面遇到了麻烦(它在其他浏览器中都能工作)。我是这样做的 /** * BaseClass */ api.BaseClass = function(something) { this.someFunction(something); }; api.BaseClass.prototype.someFunction = func

我正在将一个JavaScript客户端编码为RESTJSONAPI。因为我不想让它依赖于任何其他库,所以我使用的是香草javascript

一切都很好,但我在IE中的继承方面遇到了麻烦(它在其他浏览器中都能工作)。我是这样做的

/**
* BaseClass
*/
api.BaseClass = function(something) {
  this.someFunction(something);
};

api.BaseClass.prototype.someFunction = function() {
   // Code...
};

/**
* Subclass
*/
api.SubClass = function(something) {
  // to make the constructor be called in the base
  this.base = api.BaseClass;
  this.base(something);
  delete this.base;
};

api.SubClass.prototype.__proto__ = api.BaseClass.prototype;

// here be subclass prototypes...

使用
新api.SubClass('argument')实例化时发生错误实例未获取函数“someFunction”。有人能指导我如何正确地进行继承,即使在IE中也是如此。

这是因为IE不支持
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
您应该这样做:

api.SubClass.prototype = new api.BaseClass();

如果您使用JavaScript进行了面向对象编程,您将知道您可以创建一个类,如下所示:

Person = function(id, name, age){
    this.id = id;
    this.name = name;
    this.age = age;
    alert('A new person has been accepted');
}
Person.prototype = {
    /** wake person up */
    wake_up: function() {
        alert('I am awake');
    },

    /** retrieve person's age */
    get_age: function() {
        return this.age;
    }
}
到目前为止,我们的类person只有两个属性,我们将给它一些方法。一个干净的方法是 使用其“原型”对象。 从JavaScript 1.1开始,在JavaScript中引入了原型对象。这是一个内置对象 简化向对象的所有实例添加自定义属性和方法的过程。 让我们使用其“prototype”对象向类添加2个方法,如下所示:

Person = function(id, name, age){
    this.id = id;
    this.name = name;
    this.age = age;
    alert('A new person has been accepted');
}
Person.prototype = {
    /** wake person up */
    wake_up: function() {
        alert('I am awake');
    },

    /** retrieve person's age */
    get_age: function() {
        return this.age;
    }
}
现在我们已经定义了我们班的人。如果我们想定义另一个名为Manager的类,该类从Person继承一些属性,该怎么办。当我们定义Manager类时,重新定义所有这些属性是没有意义的,我们可以将它设置为从类Person继承。 JavaScript没有内置继承,但我们可以使用一种技术实现继承,如下所示:

Person = function(id, name, age){
    this.id = id;
    this.name = name;
    this.age = age;
    alert('A new person has been accepted');
}
Person.prototype = {
    /** wake person up */
    wake_up: function() {
        alert('I am awake');
    },

    /** retrieve person's age */
    get_age: function() {
        return this.age;
    }
}
继承管理器={}//我们创建了一个继承管理器类(名称是任意的)

现在,让我们为继承类提供一个名为extend的方法,该方法接受基类和子类参数。 在extend方法中,我们将创建一个名为继承函数继承(){}的内部类。我们为什么要用这个内在的 类是为了避免基类和子类原型之间的混淆。 接下来,我们使用以下代码使继承类的原型指向基类原型: inheritation.prototype=基类。原型; 然后我们将继承原型复制到子类原型中,如下所示:subClass.prototype=new heritation(); 下一步是为我们的子类指定构造函数,如下所示:subClass.prototype.constructor=subClass; 完成子类原型设计后,我们可以指定接下来的两行代码来设置一些基类指针

subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
以下是扩展函数的完整代码:

Inheritance_Manager.extend = function(subClass, baseClass) {
    function inheritance() { }
    inheritance.prototype = baseClass.prototype;
    subClass.prototype = new inheritance();
    subClass.prototype.constructor = subClass;
    subClass.baseConstructor = baseClass;
    subClass.superClass = baseClass.prototype;
}
现在我们已经实现了继承,我们可以开始使用它来扩展类了。在这种情况下,我们将 将Person类扩展为Manager类,如下所示:

Person = function(id, name, age){
    this.id = id;
    this.name = name;
    this.age = age;
    alert('A new person has been accepted');
}
Person.prototype = {
    /** wake person up */
    wake_up: function() {
        alert('I am awake');
    },

    /** retrieve person's age */
    get_age: function() {
        return this.age;
    }
}
我们定义Manager类

Manager = function(id, name, age, salary) {
    Person.baseConstructor.call(this, id, name, age);
    this.salary = salary;
    alert('A manager has been registered.');
}
我们让它从人身上继承下来

Inheritance_Manager.extend(Manager, Person);
如果您注意到了,我们刚刚调用了继承管理器类的extend方法,并在本例中传递了子类Manager,然后传递了基类Person。请注意,这里的顺序非常重要。如果交换它们,则继承 如果有,将无法按您的预期工作。 还要注意的是,在定义我们的子类之前,您需要指定这个继承。 现在让我们定义我们的子类:

我们可以添加更多方法,如下所示。我们的Manager类将始终在Person类中定义方法和属性,因为它继承自Person类

Manager.prototype.lead = function(){
   alert('I am a good leader');
}
现在,为了测试它,让我们创建两个对象,一个来自类Person,另一个来自继承的类管理器:

var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
您可以通过以下网址获取完整代码和更多评论:

查看这篇关于继承性的文章,我刚刚发布了一个名为“jOOPL”的JavaScript库,它允许开发人员利用JavaScript中的面向对象编程。也许你可以试一试。它是开源的:很抱歉可能出现“重复问题”。那些伟大的“相关帖子”总是在你发布问题之后出现(或者我注意到了),然后我不能将参数从子类:es构造函数传递到基类构造函数?@ullmark你可以通过api.subclass.prototype=new api.BaseClass(某物)来实现;虽然我没有像这样解决它,但它非常接近!谢谢:)是的,当然可以将参数传递给子类。您所要做的就是,在子类构造函数上:
api.SubClass=function(something){BaseClass.call(this,something);…}
根据给出的答案,不要忘记将构造函数传递回子类,所以它是这样的:
api.SubClass.prototype=new api.BaseClass();api.SubClass.prototype.constructor=api.SubClass这不起作用,因为新的基类对象可能有副作用:例如,如果构造函数检查参数并抛出错误,或者类属性发生更改。此外,还需要设置“constructor”属性+1,以列出扩展类的最合适的兼容方式-对于不支持Object.create()的浏览器,因为您将“;”放在常规赋值的末尾,我认为最好将其放在函数和属性赋值的末尾,如“Variable.prototype={….};“我想Joe Francis的意思是在子类上调用baseConstructor,而不是在基类上?