试图理解javascript对象

试图理解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); }

我写这段代码是为了帮助我更好地理解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”


更新:经过进一步的思考并记下评论人的笔记,我应该放弃尝试模拟经典继承模型。

您必须将
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,你会在这里玩得很开心。:-)体育,你会在这里玩得很开心。:-)