例如在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
功能?
答案 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种可能的继承。
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;
}
幸运的是,我在项目中记录了这些并捕获了那些JSfiddles。 我希望你能从这些中找到所需的帮助。
答案 3 :(得分:0)
不,没有用于在Javascript中扩展类的内置模式,因为它不是基于类但基于原型的语言。
但是,有许多框架可以实现'扩展'行为,例如Prototype:
var robot = Class.extend({ ... });
var bender = robot.extend({ ... });
http://ejohn.org/blog/simple-javascript-inheritance/
但是许多其他框架都支持相同的功能,例如Underscore _.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'
}