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;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这段代码展示了在JavaScript中如何实现继承的一个经典方式,使用了原型链继承和构造函数继承的组合方法。下面是对这段代码的详细解析:
Father构造函数:
function Father(name){this.name = name;}
这是一个简单的构造函数,用于创建具有name属性的Father对象。
Father.prototype.setName:
Father.prototype.setName = function(name){this.name = name;}
这里给Father的原型上添加了一个方法setName,所有Father的实例都可以访问到这个方法,用于设置name属性。
Son构造函数:
function Son(name,age){
Father.call(this,name);
this.age = age;
}
Son构造函数接受两个参数:name和age。通过Father.call(this, name),我们在Son的实例中调用了Father构造函数,实现了构造函数继承,使得每个Son实例都有name属性。
Son.prototype.setAge:
Son.prototype.setAge = function(age){this.age = age;}
同样地,为Son的原型添加了一个方法setAge,用于设置age属性。
改变原型链实现继承:
Son.prototype.__proto__ = Father.prototype;
这行代码直接修改了Son.prototype的原型(即它的__proto__属性),使其指向Father.prototype。这意味着Son的实例可以访问到Father原型上的方法,实现了原型链继承。
Son.proto = Father; 这行代码实际上不是标准的JavaScript继承实践,也不推荐这样做。它试图直接修改Son构造函数的原型,但通常这不是建立继承关系的方式。正确的做法是只调整Son.prototype.__proto__,如上一行所示。这行代码可能会导致一些非预期的行为或混淆,并且在严格模式下可能不被支持。
总结来说,这段代码主要目的是展示如何通过构造函数继承(Father.call(this, name))和原型链继承(Son.prototype.__proto__ = Father.prototype;)来实现JavaScript中的继承机制。最后一行代码则是一个不太推荐的实践,应该避免使用。正确的继承设置应该是确保Son的实例能够访问到Father的原型方法,而不需要直接修改Son构造函数的原型。