在Douglas Crockford的 JavaScript:The Good Parts 中,他用这段代码解释了伪古典继承的概念,该代码显示Cat
继承自Mammal
。
var Cat = function (name) {
this.name = name;
this.saying = 'meow';
};
// Replace Cat.prototype with a new instance of Mammal
Cat.prototype = new Mammal();
// Augment the new prototype with
// purr and get_name methods.
Cat.prototype.purr = function (n) {
var i, s = '';
for (i = 0; i < n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
return s;
};
Cat.prototype.get_name = function () {
return this.says() + ' ' + this.name +
' ' + this.says();
};
var myCat = new Cat('Henrietta');
var says = myCat.says(); // 'meow'
var purr = myCat.purr(5); // 'r-r-r-r-r' var name = myCat.get_name();
// 'meow Henrietta meow'
然后他介绍了一种名为“inherits”的新方法,以帮助提高代码的可读性。
Function.method('inherits', function (Parent) {
this.prototype = new Parent();
return this;
});
他使用新的'inherit'方法再次显示了这个例子。
var Cat = function (name) {
this.name = name;
this.saying = 'meow';
}.
inherits(Mammal).
method('purr', function (n) {
var i, s = '';
for (i = 0; i < n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
return s;
}).
method('get_name', function () {
return this.says() + ' ' + this.name + ' ' + this.says();
});
在我看来,在这个新示例中,purr
和get_name
直接在Cat
对象上定义,而在第一个示例中,它们是在Cat.prototype
上定义的。是对的吗?如果是这样,为什么他没有在Cat.prototype
上定义他的新方法?它有所作为吗?
答案 0 :(得分:0)
purr
和get_name
直接在Cat
对象上定义,而在第一个示例中,它们是在Cat.prototype
上定义的。是对的吗?
没有。虽然他在method
函数上调用Cat
方法,但它确实在接收器的.prototype
属性上定义了方法。也许回头几页,再看看Function.prototype.method
的代码:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
它有所作为吗?
是的,它会的。