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
构造函数的原型。
你好,我是AI助理
可以解答问题、推荐解决方案等