我已经编写了这段代码,试着帮助我理解对象在js中的工作原理。
function person(personName){
var thiz = this;
var nameOfMe = (typeof(personName) === 'undefined')? 'default':personName;
var faveFood = 'stuff';
thiz.speakName =function(){
alert('I am '+ thiz.nameOfMe);
}
thiz.gotFoodAlert = function(){
alert('Yummy! I haz ' + thiz.faveFood )
}
}
var someGuy = new person('joe');
someGuy.faveFood = 'cheesecake';
someGuy.speakName();
var elseGuy = new person();
elseGuy.nameOfMe = 'bob';
elseGuy.speakName();
我正在尝试模拟经典继承模型来构建一个类然后实例化一个人。在elseGuy.speakName()中单独设置警报'bob'确定。
我不明白为什么当我实例化时someGuy.speakName()警告'joe'为什么?
更新:关于进一步思考和记录评论的人,我应该放弃尝试模拟经典的继承模型。
答案 0 :(得分:2)
因为nameOfMe
在第一个示例中不是this
的属性。请尝试以下方法:
function person(personName) {
var nameOfMe = (typeof personName === 'undefined')? 'default':personName;
var faveFood = 'stuff';
this.speakName = function () {
alert('I am ' + nameOfMe);
}
this.gotFoodAlert = function () {
alert('Yummy! I haz ' + faveFood )
}
}
更好:
function Person(personName) {
this.nameOfMe = personName ? 'default' : personName;
this.faveFood = 'stuff';
}
Person.prototype.speakName = function () {
alert(this.nameOfMe);
};
Person.prototype.gotFoodAlert = function () {
alert('Yummy! I haz ' + this.faveFood);
};
答案 1 :(得分:1)
您必须将nameOfMe
设置为thiz
的属性:
thiz.nameOfMe = (typeof(personName) === 'undefined')? 'default':personName;
另外,除非你绝对必须,为什么不使用普通this
代替thiz
?
答案 2 :(得分:1)
thiz = this
别名。你只需要通过额外的闭包来获得“私人”属性。thiz.nameOfMe
在这里引起了额外的关闭,不必要。thiz.nameOfMe
的值不是"joe"
,因为thiz
引用的对象尚未拥有nameOfMe
属性。构造函数代码中的nameOfMe
变量是另一回事。person
实例,即一个以person
为构造函数的对象,以及person.prototype
当前在其原型链中引用的对象。没什么,没什么。Person
。