JavaScript不像其他OOP语言那样使用类,而是使用评级器原型。
“类”原型中的任何内容都可用于该“类”的所有实例,即使它是在创建“类”实例之后添加的。
“类”本身实际上只是一个函数。但当使用“new”运算符调用时,它的行为将类似于大多数其他OOP的Class构造函数。
在“Class”和构造函数上的每个方法中都会有一个关键字(
this
)这将是该实例的句柄。
var Bar = function() {
// Im the constructor
}
Bar.prototype.setName = function(name) {
// Im a method on the instances of Bar
// We assing our property `name` with the value from my first argument
this.name = name;
}
Bar.prototype.getName = function(name) {
return this.name;
}
var bar = New Bar();
bar.setName('John');
console.log(bar.getName()); // John
这可能不会直接回答你的问题,但如果你想得足够久,它可能会最终回答你。
JavaScript中的继承基于遍历“原型链”。看起来很奇怪,原型可以有原型。尝试访问属性时,将检查原型。如果在该原型中找不到该属性,则将检查该原型的原型,依此类推,直到没有更多的原型。因此,为了创建一个“子类”,从它的“超级类”中继承属性和方法,您必须执行以下操作:
var Foo = function() {
// Foo's constructor, remember to call your supers as well:
Bar.call(this);
}
Foo.prototype = Object.create(Bar.prototype);
Foo.prototype.fooMethod = function() {
return -1;
}
var foo = new Foo();
foo.setName('John');
foo.getName(); // John
foo.fooMethod(); // -1
您可以使用我们上面学到的内容在实例中创建实例:
当我们创建Foo的实例时(
foo
),将创建Bar的实例(
foo.bar
):
var Bar = function() {
// Im the constructor
}
Bar.prototype.setName = function(name) {
// Im a method on the instances of Bar
// We assing our property `name` with the value from my first argument
this.name = name;
}
Bar.prototype.getName = function(name) {
return this.name;
}
var Foo = function() {
this.bar = new Bar();
}
var foo = new Foo();
foo.bar.setName('John');
console.log(foo.bar.getName()); // John