JavaScript 对象原型未通过工厂返回
JavaScript Object prototype not returned via Factory
我已经设法创建了一个名为"createHumanByGender"的"类似工厂"的函数,但是,返回的对象不允许我将其原型方法称为"Human.prototype.getFullName()"。会有什么原因吗?
代码如下:
// get female instance of Jade
var jade = createHumanByGender.bind( this, 'Female', 'Jade', 'Taylor' )();
console.log( jade.getFullName() );
// ------------------------------------------------
// HUMAN
function Human ( forename, surname ) {
this.forename = forename;
this.surname = surname;
this.age = 0;
}
Human.prototype = {
getForename : function () {
return this.forename;
},
getSurname : function () {
return this.surname;
},
getFullName : function () {
return this.forename + ' ' + this.surname;
}
};
// MALE
function Male ( forename, surname ) {
Human.call( this, forename, surname );
this.gender = 'Male';
}
Male.prototype = Object.create( Human.prototype );
// FEMALE
function Female ( forename, surname ) {
Human.call( this, forename, surname );
this.gender = 'Female';
}
Female.prototype = Object.create( Human.prototype );
// GENDER
function createHumanByGender ( gender, forename, surname ) {
return new this[gender]( forename, surname );
}
在代码中,在代码运行之前调用构造函数来分配prototype
,因此对象没有从原型继承方法。 将对工厂函数的调用移到构造函数的定义之后。
此外,以您使用的方式使用this
通常是一种不好的做法,因为它可能无法在严格模式下工作。 要么直接引用你想要的window
,要么将构造函数作为某个命名空间对象的属性,并直接在该对象上查找它们。
此版本的代码有效(此处为工作演示):
// ------------------------------------------------
// HUMAN
function Human ( forename, surname ) {
this.forename = forename;
this.surname = surname;
this.age = 0;
}
Human.prototype = {
getForename : function () {
return this.forename;
},
getSurname : function () {
return this.surname;
},
getFullName : function () {
return this.forename + ' ' + this.surname;
}
};
// MALE
function Male ( forename, surname ) {
Human.call( this, forename, surname );
this.gender = 'Male';
}
Male.prototype = Object.create( Human.prototype );
// FEMALE
function Female ( forename, surname ) {
Human.call( this, forename, surname );
this.gender = 'Female';
}
Female.prototype = Object.create( Human.prototype );
// GENDER
function createHumanByGender ( gender, forename, surname ) {
var f = this[gender];
return new f( forename, surname );
}
// get female instance of Jade
var jade = createHumanByGender.bind( this, 'Female', 'Jade', 'Taylor' )();
console.log( jade.getFullName() );
仅供参考,我建议您将工厂函数更改为:
// GENDER
function createHumanByGender ( gender, forename, surname ) {
var f = window[gender];
return new f( forename, surname );
}
然后,像这样称呼它:
// get female instance of Jade
var jade = createHumanByGender('Female', 'Jade', 'Taylor');
console.log( jade.getFullName() );
仅供参考,如果您真的想在要立即调用的函数中引起this
值,请使用.call()
而不是.bind()
- 但这里都不需要。
相关文章:
- 工厂返回数据后未设置角度$scope
- 从角度工厂返回数据,返回对象后填充数据
- AngularJS:从工厂返回配置
- 努力将结果从工厂返回到范围
- 控制器未从工厂返回数据
- 角度控制器/工厂返回未定义的对象
- JavaScript 对象原型未通过工厂返回
- 从工厂返回控制器$http承诺时未定义
- 离子平台准备就绪后,从棱角分明的工厂返回
- 如何将对象从使用PouchDB的工厂返回到控制器
- AngularJS工厂返回类型未定义
- angularjs从工厂返回数组
- Angular JS,工厂返回数据,但在控制器中它消失了
- Ionic角工厂返回undefined
- 如何在angularjs中使用http get从工厂返回业务对象
- 在Angular中从工厂返回响应到控制器
- AngularJS从工厂返回值到控制器
- AngularJS工厂返回State对象,而不是promise中的JSON数据
- Angular工厂返回index.html作为响应.data而不是JSON
- 不能使用AngularJS工厂返回的数据