试图理解javascript对象
我写这段代码是为了帮助我更好地理解js中对象的工作原理试图理解javascript对象,javascript,object,Javascript,Object,我写这段代码是为了帮助我更好地理解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); }
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”
更新:经过进一步的思考并记下评论人的笔记,我应该放弃尝试模拟经典继承模型。您必须将
nameOfMe
设置为thiz
的一个属性:
thiz.nameOfMe = (typeof(personName) === 'undefined')? 'default':personName;
此外,除非您必须这样做,为什么不使用正常的
this
而不是thiz
?您必须将nameOfMe
设置为thiz
的属性:
thiz.nameOfMe = (typeof(personName) === 'undefined')? 'default':personName;
此外,除非您必须这样做,否则为什么不使用正常的
this
而不是thiz
?因为在第一个示例中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);
};
因为在第一个示例中,
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);
};
thiz=此处不需要别名。您只需要通过附加闭包为“私有”属性使用它
thiz.nameOfMe
在这里造成了额外的闭包,这是不必要的thiz.nameOfMe
的值不是“joe”
,因为thiz
引用的对象还没有nameOfMe
属性。构造函数代码中的nameOfMe
变量是另一个变量person
实例,也就是说,一个以person
作为构造函数的对象,以及person.prototype
当前在其原型链中引用的下一个对象。不多不少Person
thiz=此处不需要别名。您只需要通过附加闭包为“私有”属性使用它
thiz.nameOfMe
在这里造成了额外的闭包,这是不必要的thiz.nameOfMe
的值不是“joe”
,因为thiz
引用的对象还没有nameOfMe
属性。构造函数代码中的nameOfMe
变量是另一个变量person
实例,也就是说,一个以person
作为构造函数的对象,以及person.prototype
当前在其原型链中引用的下一个对象。不多不少Person
.不,它有效,只是更好版本中的一个小错误:this.nameOfMe=personName?personName:'默认';你的第二个版本并不是更好。第一个有点像私人成员,而第二个只有公共成员。不,它有效,只是更好版本中的一个小错误:this.nameOfMe=personName?personName:'默认';你的第二个版本并不是更好。第一个有私人会员,而第二个只有公共会员。PE,你会在这里玩得很开心。:-)体育,你会在这里玩得很开心。:-)