试图理解javascript对象

时间:2011-11-28 00:07:18

标签: 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);
  }

  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'为什么?

更新:关于进一步思考和记录评论的人,我应该放弃尝试模拟经典的继承模型。

3 个答案:

答案 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)

    此处不需要
  1. thiz = this别名。你只需要通过额外的闭包来获得“私人”属性。
  2. thiz.nameOfMe在这里引起了额外的关闭,不必要。
  3. thiz.nameOfMe的值不是"joe",因为thiz引用的对象尚未拥有nameOfMe属性。构造函数代码中的nameOfMe变量是另一回事。
  4. 使用“经典继承模型”。 没有课程。您正在创建一个person实例,即一个以person为构造函数的对象,以及person.prototype当前在其原型链中引用的对象。没什么,没什么。
  5. 构造函数标识符以大写字母开头是一个很好的代码样式:Person
  6. RTFM