关于何时在Crockford的Pseudoclassical Inheritance示例中使用原型的困惑

时间:2016-08-10 20:43:10

标签: javascript inheritance prototype

在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();
});

在我看来,在这个新示例中,purrget_name直接在Cat对象上定义,而在第一个示例中,它们是在Cat.prototype上定义的。是对的吗?如果是这样,为什么他没有在Cat.prototype上定义他的新方法?它有所作为吗?

1 个答案:

答案 0 :(得分:0)

  

purrget_name直接在Cat对象上定义,而在第一个示例中,它们是在Cat.prototype上定义的。是对的吗?

没有。虽然他在method函数上调用Cat方法,但它确实在接收器的.prototype属性上定义了方法。也许回头几页,再看看Function.prototype.method的代码:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};
  

它有所作为吗?

是的,它会的。