JavaScript-js关于继承的问题
我知道这样可以实现继承
function Father(){
this.name=name;
}
Father.prototype.sayName=function(){
alert(this.name);
}
function Son(name,age){
this.name=name;
this.age=age;
this.sayAge=function(){
alert(this.age);
}
}
Son.prototype=new Father();
var son=new Son("zhangsan",20);
son.sayName();
son.sayAge()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
仅仅执行Father方法和new Father()是不一样的。
this.method=Father;
this.method(name);
只能让this获得name属性,但是内部属性__proto__并没有指向Father.prototype,所以Son的实例无法调用sayName
所以在某些可以改动__proto__的浏览器上这么写就行了
function Son(name,age){
this.method=Father;
this.method(name);
this.__proto__ = Father.prototype; //加上它就可以调用啦
delete this.method;
this.age=age;
this.sayAge=function(){
alert(this.age);
}
但是这么写继承带来的问题太多了
exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
这是Node.js的继承处理。
实际处理过程是复制一份父类的prototype到子类的prototype。而不是初始化一个父类的实例拷贝到prototype。你可以用chrome浏览器的debug看一下,实际结构是不一样的。
js可以理解为,请求object的某个变量或函数时,先从object中查找,如果找到,则直接调用,如果没找到,则再到prototype中查找。
将父类的prototype拷贝到子类的prototype中,然后对子类进行操作时,就可以查找到父类的prototype中的函数。
如果将父类的实例拷贝到子类的prototype中,实际结构应该是这样的了:
object
object的属性
prototype // 父类实例
父类的属性
prototype
这样也是搜索不到父类prototype下的函数。
这个东西我说不清。。。希望你能意会。。。