开发者社区 问答 正文

ES5规范中JS继承为什么不用class关键字改变原型链的那种继承方式来实现

function Father(name){this.name = name;}
Father.prototype.setName = function(name){this.name = name;}
function Son(name,age){
    Father.call(this,name);
    this.age = age;
}
Son.prototype.setAge = function(age){this.age = age;}
// 改变原型链,实现继承
Son.prototype.__proto__ = Father.prototype;
Son.__proto__ = Father;

展开
收起
游客tm4ozmu57cr3a 2019-08-14 11:02:46 712 分享
分享
版权
举报
阿里云 AI 助理回答

这段代码展示了在JavaScript中如何实现继承的一个经典方式,使用了原型链继承和构造函数继承的组合方法。下面是对这段代码的详细解析:

  1. Father构造函数:

    function Father(name){this.name = name;}
    

    这是一个简单的构造函数,用于创建具有name属性的Father对象。

  2. Father.prototype.setName:

    Father.prototype.setName = function(name){this.name = name;}
    

    这里给Father的原型上添加了一个方法setName,所有Father的实例都可以访问到这个方法,用于设置name属性。

  3. Son构造函数:

    function Son(name,age){
       Father.call(this,name);
       this.age = age;
    }
    

    Son构造函数接受两个参数:nameage。通过Father.call(this, name),我们在Son的实例中调用了Father构造函数,实现了构造函数继承,使得每个Son实例都有name属性。

  4. Son.prototype.setAge:

    Son.prototype.setAge = function(age){this.age = age;}
    

    同样地,为Son的原型添加了一个方法setAge,用于设置age属性。

  5. 改变原型链实现继承:

    Son.prototype.__proto__ = Father.prototype;
    

    这行代码直接修改了Son.prototype的原型(即它的__proto__属性),使其指向Father.prototype。这意味着Son的实例可以访问到Father原型上的方法,实现了原型链继承。

  6. Son.proto = Father; 这行代码实际上不是标准的JavaScript继承实践,也不推荐这样做。它试图直接修改Son构造函数的原型,但通常这不是建立继承关系的方式。正确的做法是只调整Son.prototype.__proto__,如上一行所示。这行代码可能会导致一些非预期的行为或混淆,并且在严格模式下可能不被支持。

总结来说,这段代码主要目的是展示如何通过构造函数继承(Father.call(this, name))和原型链继承(Son.prototype.__proto__ = Father.prototype;)来实现JavaScript中的继承机制。最后一行代码则是一个不太推荐的实践,应该避免使用。正确的继承设置应该是确保Son的实例能够访问到Father的原型方法,而不需要直接修改Son构造函数的原型。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等