是否有可能在javascript中继承另一个类的属性 - 而不是现有的对象?

时间:2015-09-02 07:38:37

标签: javascript inheritance

例如在PHP中,如果您希望一个类继承另一个类的属性,您将引用父

<?php 

class BaseController {
    // ....
}

class UserController extends BaseController {
    // ....
}

但是在javascript中如果你想让一个新的类或对象从另一个类继承一些属性 - 你似乎需要将你想要继承的类的 - 已经实例化的 - 对象分配给你的对象原型。

e.g。如果您想创建一个全新的对象并访问现有对象的属性:

var robot = {
  active : "yes",
  primeDirective : function() {
    console.log("Must kill all humans!");
  }  
};

var bender = Object.create(robot);
bender.primeDirective();  => "Must kill all humans!" 

或者如果您有现有对象,则可以使用__proto__

将现有对象分配给原型
var robot = {
  active : "yes",
  primeDirective : function() {
    console.log("Do a flip!");
  }  
};

var bender = {
  name : "Bender Bending Rodriguez"  
};

bender.__proto__ = robot;
bender.primeDirective(); => "Do a flip!"

这两个方法都需要一个已创建的对象来继承属性,类定义是否可以从另一个类继承 - 类似于PHP中的extends功能?

5 个答案:

答案 0 :(得分:2)

如果你想要动态地继承一点,你需要创建一个构造函数(或ES6类)。

function Robot() {
    this.active = true;
}
Robot.prototype.primeDirective = function() { 
    console.log("Must kill all humans!"); 
};

var bender = new Robot(); // Yey!

创建一个新的继承构造函数:

function HumanoidRobot() {
    Robot.apply(this, arguments);
    this.legs = 2;
}
HumanoidRobot.prototype = Object.create(Robot.prototype);
HumanoidRobot.prototype.constructor = HumanoidRobot;

使用ES6课程可以轻松完成此过程,这样可以隐藏所有这些丑陋!

class Robot {
    constructor() {
        this.active = true;
    }
    primeDirective() {
        console.log("Must kill all humans!");
    }
}

class HumanoidRobot extends Robot() {
    constructor() {
        super()
        this.legs = 2;
    }
}

答案 1 :(得分:2)

在ES5 JavaScript中,派生类的正确方法是使用Object.create传递基类的prototype,而不是实例,然后确保所有函数都是该原型的一部分。

// a properly formed constructor function
function Robot(name) {
    this.name = name;
}

// all functions belong on the prototype
Robot.prototype.primeDirective = function() {
    ...
}

// create derived class
function BendingUnit22(name) {
    Robot.call(this, name);       // invoke superclass constructor
}

// create and attach a new prototype object chained from the base class
BendingUnit22.prototype = Object.create(Robot.prototype);

// and re-attach the constructor
BendingUnit22.prototype.constructor = BendingUnit22;

// add new or overriding functions here
BendingUnit22.prototype.primeDirective = function() {
    ...
}

var bender = new BendingUnit22("Bender Bending Rodriguez");

答案 2 :(得分:0)

JavaScript中有3种可能的继承。

  1. Pseudo Classical(就像你要找的那样)

    public static double streamedCalculate(double val) {
        class MutableDouble {
            double currVal;
            MutableDouble(double initVal) {
                currVal = initVal;
            }
        }
    
        final MutableDouble accumulator = new MutableDouble(val);
    
        myList.stream().forEachOrdered((x) -> accumulator.currVal += x.apply(accumulator.currVal));
        return accumulator.currVal;
    }
    

    https://jsfiddle.net/nikdtu/4wzuwhqw/

  2. 功能 (https://jsfiddle.net/nikdtu/eh7u4pxd/

  3. Prototypal(Object.create) (https://jsfiddle.net/nikdtu/dnjkx8w1/
  4. 幸运的是,我在项目中记录了这些并捕获了那些JSfiddles。 我希望你能从这些中找到所需的帮助。

答案 3 :(得分:0)

不,没有用于在Javascript中扩展类的内置模式,因为它不是基于类但基于原型的语言。

但是,有许多框架可以实现'扩展'行为,例如Prototype:

 var robot = Class.extend({ ... });
 var bender =  robot.extend({ ... });

http://ejohn.org/blog/simple-javascript-inheritance/

但是许多其他框架都支持相同的功能,例如Underscore _.extend()

http://underscorejs.org/#extend

答案 4 :(得分:-1)

我认为这就是你要找的东西

sourceSets {
    windows {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
    }
    linux {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
    }
}

dependencies {
    linuxCompile 'net.java.dev.jna:jna:4.1.0'
    linuxCompile 'net.java.dev.jna:jna-platform:4.1.0'
    windowsCompile 'net.java.dev.jna:jna:4.1.0'
    windowsCompile 'net.java.dev.jna:jna-platform:4.1.0'
}