Phantomjs javascript 继承误区
Phantomjs javascript inheritance misunderstanding
我有以下文件:
- run.js(到 运行 整个脚本)
- animal.js(parent 摘要 class 猫)
- animal/cat.js(child class for animal,我想调用方法)
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 );
}
我有以下文件:
- run.js(到 运行 整个脚本)
- animal.js(parent 摘要 class 猫)
- animal/cat.js(child class for animal,我想调用方法)
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 );
}