Javascript OOP - 声明对象的方法

时间:2013-11-08 18:59:18

标签: javascript oop

这是我能想到的最基本的JS对象示例,它说明了我的问题。

问题1。

如何引用类中的函数,以便在其他代码中我可以调用方法?这给了我一个错误。

  var name1 = new Name();
  name1.render(); 

问题2。

在线声明函数与使用var getByID = function() ...

之间的区别是什么?

示例对象:

function Name(user_id, container_id) {
  this.userID = user_id;
  this.containerID = container_id;
  this.firstName = null;
  this.lastName = null;

  function getByID(userID) {
    // An ajax call that takes a userID to get a name.
  }

  function setName() {
    // An ajax call to get the name from db.
    name_record = this.getByID(this.userID); ????? this returns an error that getByID is undefined.
    this.firstName = name_record.firstName;
    this.lastName = name_record.lastName;
  }

  function render() {
    $(this.containerID).val(this.firstName + ' ' + this.lastName);
  }
}

3 个答案:

答案 0 :(得分:2)

你可以像在第二个问题中那样声明一个对象,它是有效的,因为函数 也是一个对象。或者其他方式:

var Name = {
    render: function() {
    }
}

Name.render();

prototype

function Name() {
}

Name.prototype.render = function() {
}
// or
Name.prototype = {
    getByID: function() {
    },
    setName: function() {
    }
}
var n = new Name();

所有这些snipets都是有效的对象声明。

你的第二个问题可能会回答第一个问题。声明如下函数时:

function Name() {
    function render() {
    }
}
var n = new Name();

就像render()是私有方法一样。如果您在函数名称n.render()之外调用,则会看到抛出错误,因为无法识别render。但如果你改变这个......

function Name() {
    this.render = function() {
    }
}

...然后n.render()将像render()一样成为公共方法。有关publicprivate方法的详细信息,请参阅thisthis

现在,声明“内联”功能或将其设置为变量之间的区别在于:

function Name() {
}

你可以这样做:

var n1 = Name();
var n2 = Name();
var nn = Name(); // and so on...

但是:

var n = function Name() {
}

n()是否有效,Name()不会。即使var a = Name()也会抛出异常。

Here's a good article关于这个值得阅读的主题。我希望它可以提供帮助。

答案 1 :(得分:0)

问题1: A" Class"在Javascript中只不过是一个对象。对象具有您可以访问的属性。这些属性是变量,函数或其他对象。通过声明您的功能:

  function render() {
    $(this.containerID).val(this.firstName + ' ' + this.lastName);
  }

您正在声明函数Name()范围内的函数,但该函数不是Name的属性。它只是一种私人方法。有多种方法可以使它成为Name()的一部分,例如:

function Name(user_id, container_id) {
  this.userID = user_id;
  this.containerID = container_id;
  this.firstName = null;
  this.lastName = null;
  this.render = function() {
    console.log('hello world');
  }
}

var name1 = new Name();
name1.render();

问题2: 没有区别。它们只是两种不同的语法,可以实现相同的结果。第二种方式(声明var并定义函数)会立即为您提供函数的引用,但这可以通过第一种方式实现。

答案 2 :(得分:0)

回答你的第一个问题:

函数getByID,setName和render是构造函数的本地函数,不能由类对象调用。你必须使用原型继承。

例如。

function Name(user_id, container_id) {
this.userID = user_id;
this.containerID = container_id;
this.firstName = null;
this.lastName = null;
}

Name.prototype = {

getByID :function(userID) {
  // An ajax call that takes a userID to get a name.
}

setName:function() {
  // An ajax call to get the name from db.
  name_record = this.getByID(this.userID); 
  this.firstName = name_record.firstName;
  this.lastName = name_record.lastName;
}

render:function() {
  $(this.containerID).val(this.firstName + ' ' + this.lastName);
}
};

回答你的第二个问题:

以防万一     ABC(); //错误     function abc(){     }

此函数是在运行时创建的,因此您只能在声明

之后调用它

但是,这个

abc();
var abc = function(){
};

是在解析时创建的,因此您可以在声明之前调用它。