通过原型进行 JavaScript 继承
JavaScript inheritance through prototype
有最流行的JavaScript继承方法:
function extend(Child, Parent) {
var F = function() { }
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.superclass = Parent.prototype;
}
我现在正在学习JS,但我有很多Java经验,这种继承模型对我来说似乎有些困难。为什么我不能做以下事情:
function extend(Child, Parent) {
Child.prototype = Parent.prototype;
Child.prototype.constructor = Child;
}
我想我不知道/不明白有些事情,但在我看来 F 对象是无用的。请澄清情况。谢谢。
Child.prototype = Parent.prototype;
现在Child.prototype
和Parent.prototype
是同一个对象。
将方法添加到Child.prototype
会将它们添加到Parent.prototype
,这不是经典的OOP继承的工作方式。
要认识到的最重要的事情是,JavaScript 本身没有内置经典继承。 它不像Java,所以如果你想使用JavaScript的原型,你会想把所有的Java继承想法都扔到窗外。
原型的想法是将单个对象连接到构造函数。这是您的原型对象。使用构造函数生成新对象,这些对象都可以访问构造函数原型中包含的方法。诀窍在于,如果您修改附加到构造函数的原型,您更改的方法现在将更改为构造函数创建的所有子对象。 它的工作原理是这样的:
function Cat(name) {
this.name = name;
}
Cat.prototype = {
furColor: function () {
return 'gray';
}
};
var kitty1 = new Cat('Bob');
//=> {name: 'Bob'}
kitty1.furColor();
//=> 'gray'
Cat.prototype.furColor = function () {
return 'white';
}
var kitty2 = new Cat('Sally');
//=> {name: 'Sally'}
kitty2.furColor();
//=> 'white'
kitty1.furColor();
//=> 'white'
因此,如果你想从这个模型构建经典继承,你可以,但请记住,这就是你在 JavaScript 中得到的原型。
有一个非常流行的经典继承插件,它给你一些不错的OO JavaScript,叫做klass,你可能想尝试而不是自己滚动。
我相信javascript prototype
是一个对象的实际实例,如果你做这样的事情:
Child.prototype = Parent.prototype;
Child.prototype.constructor = Child;
您还将更改Parent
的原型,因为它们是对象的相同实例。
相关文章:
- 关于Javascript继承,我可以'我不明白
- Javascript继承代码集
- Javascript:继承原型而不重新定义构造函数
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- JavaScript继承:为什么从实例复制
- javascript继承中正确的原型做作是什么
- 没有原型的Javascript继承
- Javascript继承-使用.call方法
- 运行Javascript继承代码时出错
- Javascript继承构造函数
- Javascript继承和封装,高效完成
- 具有简洁原型赋值语法的Javascript继承
- Javascript继承的问题&基类原型
- JavaScript继承构造函数.prototype
- javascript继承说明
- Javascript继承:从超类的方法设置子类的属性
- 简单的 Javascript 继承示例
- 具有意外行为的 JavaScript 继承
- 基于实例的 JavaScript 继承
- 为什么 JavaScript 继承是这样工作的