gpt4 book ai didi

javascript - 如何从javascript中的类继承?

转载 作者:IT王子 更新时间:2023-10-29 02:42:46 26 4
gpt4 key购买 nike

在 PHP/Java 中可以这样做:

class Sub extends Base
{
}

并且 Super 类的所有公共(public)/ protected 方法、属性、字段等都会自动成为 Sub 类的一部分,必要时可以重写。

Javascript 中的等价物是什么?

最佳答案

在 JavaScript 中,您没有,但您可以通过多种方式获得继承和行为重用:

伪经典继承(通过原型(prototype)设计):

function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';

function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();

应与 new 运算符一起使用:

var subInstance = new Sub();

函数应用或“构造函数链”:

function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}


function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}

这种方法也应该与 new 运算符一起使用:

var subInstance = new Sub();

与第一个示例的不同之处在于,当我们应用 Super 构造函数到Sub 中的this 对象时>,它将分配给 Super 上的 this 的属性直接添加到新实例上,例如subInstance 直接包含属性 member1member2 (subInstance.hasOwnProperty('member1') == true;) .

在第一个示例中,这些属性是通过原型(prototype)链实现的,它们存在于内部[[Prototype]] 对象中。

寄生继承或 Power Constructors:

function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};

return obj;
}

function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}

这种方法基本上是基于“对象扩充”,你不需要使用 new 运算符,正如你所看到的,this 关键字不是涉及。

var subInstance = createSub();

ECMAScript 第 5 版。 Object.create 方法:

// Check if native implementation available
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {} // empty constructor
F.prototype = o; // set base object as prototype
return new F(); // return empty object with right [[Prototype]]
};
}

var superInstance = {
member1: 'superMember1',
member2: 'superMember2'
};

var subInstance = Object.create(superInstance);
subInstance.member3 = 'subMember3';

上述方法是Crockford提出的原型(prototype)继承技术。 .

对象实例继承自其他对象实例,仅此而已。

这种技术可能比简单的“对象扩充”更好,因为继承的属性不会复制到所有新对象实例上,因为 base 对象被设置为 [[Prototype ]]extended 对象,在上面的例子中 subInstance 在物理上只包含 member3 属性。

关于javascript - 如何从javascript中的类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2107556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com