Phantomjs javascript 继承误区

Phantomjs javascript inheritance misunderstanding

我有以下文件:

run.js

var cat = require('./animal/cat').create('Tom');
console.log( cat.petName );
console.log( cat.paws );
cat.voice();

animal.js

function animal(){
   this.paws = 4;
}

exports.create = function(){
    return new animal();
}

animal/cat.js

function cat( name ){
    this.petName = name
}

cat.voice = function(){
    console.log('myouu');
}

exports.create = function( name ){
    cat.prototype = require('../animal').create();
    return new cat( name );
}

当我控制台记录 cat class 的属性时——一切正常。提示打印:
汤姆
4
这意味着那只猫仍然继承自动物。 但是在调用该方法时,出现以下错误:
类型错误:'undefined' 不是构造函数(正在评估 'cat.voice()') run.js:4 全局代码

我就是不明白这是怎么回事。有人可以解释错误吗?

voice函数是cat()构造函数的方法,不是cat对象(由构造函数返回)的方法。在其他语言中,这称为 class 方法或静态方法。

要为 cat 对象创建方法,您需要将其添加到原型中:

cat.prototype.voice = function(){
    console.log('myouu');
}

但请注意,在您的 cat create 函数中,您随后会覆盖原型。所以这样做:

exports.create = function( name ){
    cat.prototype = require('../animal').create();
    return new cat( name );
}

如果按照我上面显示的示例定义,将删除语音方法。正确的做法是在声明额外的方法之前需要先继承:

cat.prototype = require('../animal').create();
cat.prototype.voice = function(){
    console.log('myouu');
}

exports.create = function( name ){
    return new cat( name );
}