【问题标题】:What variable can we put inside the construction function in javascript?我们可以在javascript的构造函数中放入什么变量?
【发布时间】:2015-12-16 04:45:59
【问题描述】:
function Person(name, family) {
    this.name = name;
    this.family = family;
}

Person.prototype.getFull = function() {
    return this.name + " " + this.family;
};

为什么我们必须输入 this.name = name; this.family = family;?为什么这个。?为什么我们不能只做var name1 = name

【问题讨论】:

  • 对象属性与变量不同。
  • 因为var p = new Person('bob', 'smith'); 会将p 设置为(引用)这个对象:{name:'bob', family:'smith'}。如果您执行var name=name,那么p 将引用一个空对象{},因为您尚未在其上设置任何实例属性。顺便说一句,这个问题可能在 SO 和其他地方被重复了无数次。
  • @Barmer 如此笼统,即使我知道。不回答问题

标签: javascript function class oop constructor


【解决方案1】:

var 创建一个仅在声明它的函数范围内可用的局部变量(在您的问题中是构造函数)。

this.name = xxx 将属性分配给刚刚在构造函数中创建的当前对象,并且任何引用该对象的人都可以使用该属性。

在使用new 运算符调用对象构造函数时,this 被设置为构造函数及其原型中定义的类型的新创建对象。因此,要引用该对象实例的属性,您必须使用 this.xxx

因此,您必须使用这两种技术中的任何一种来匹配您想要做的事情。有var的构造函数中局部变量的情况,也有初始化实例变量的情况。

这里是一个不同的例子:

实例变量:

function Person(name, family) {
    this.name = name;
    this.family = family;
}

Person.prototype.getFull = function() {
    return this.name + " " + this.family;
};

var p = new Person("Bob", "Smith");
console.log(p.name);    // "Bob"

局部变量:

function Person(name, family) {
    var aName = name;
    var aFamily = family;
    // these variables are local and only available 
    // within the scope of the constructor
}

Person.prototype.getFull = function() {
    // this.name and this.family are not defined
    return this.name + " " + this.family;
};

var p = new Person("Bob", "Smith");
console.log(p.aName);    // undefined
console.log(p.aFamily);   // undefined

额外功劳:私有实例变量

有一个混合模型,您可以在构造函数中定义方法,然后这些方法只能访问构造函数中的局部变量。这些变量然后表现得像“私有”实例变量。它们在技术上不是对象的属性,但由于创建了闭包,构造函数中定义的任何方法都可以使用它们。这是私有实例变量的巧妙技巧。这是一个例子:

function Person(name, family) {
    var aName = name;
    var aFamily = family;

    // define method within the constructor that has access to
    // local variables here
    this.getFull = function() {
        return aName + " " + aFamily;
    }
}

var p = new Person("Bob", "Smith");
console.log(p.getFull());    // "Bob Smith"
console.log(p.aName);        // undefined, not instance properties
console.log(p.aFamily);      // undefined, not instance properties

【讨论】:

  • 在回答(而不是仅仅评论)明显是重复的问题时,正确的 SO 指南是什么?
  • @caasjj - 如果您知道一个很好的副本可以完美地回答问题,那么投票将 OP 的问题作为副本关闭。我不知道有这样的重复,所以我回答了这个问题。 cmets 中不应提供答案。
  • 感谢指南,但我认为我没有代表投票支持重复(?),但在 google 或 duckduckgo 中搜索“stackoverflow var vs this”会出现 stackoverflow.com/questions /4354418/…, 和 stackoverflow.com/questions/27589494/javascript-var-vs-this, and ..,
  • @caasjj - 然后,直到您有声望投票结束 (which looks like it requires 3000 points),您可以评论原始问题并附上推荐重复的链接,其他有足够代表的人会看看是否他们同意你的看法。
  • @sdfdsfsdf - 这是一个被广泛讨论的问题。以下是一些参考资料:Advantages of using prototype, vs defining methods straight in the constructor?Use of Prototype vs. this in Javascript,还有更多类似的答案。
【解决方案2】:

你可以做 var name1 = name.但是,这个变量将是人员范围内的私有变量,如果没有父函数内部的属性作为返回该变量的 get 函数,您的原型或人员范围之外的任何内容将无法直接访问它们。

我们使用对象属性,以便它们可以在父范围之外共享或访问。

【讨论】:

  • 现在告诉我一件事。为什么要使用原型?听说内存效率更高?请简单解释一下
  • 是的,你说得对,它更节省内存。因为假设我们将所有方法定义为对象中的属性,所以每次实例化该对象时,我们都会为每个新对象重新创建所有属性。就好像我们在原型上定义了所有方法一样,它们不会每次都重新创建。同样在客户端浏览器上更喜欢基于原型进行查找
猜你喜欢
  • 2015-03-09
  • 2011-05-06
  • 2021-06-11
  • 2012-08-10
  • 2021-09-23
  • 2014-01-30
  • 2013-05-13
  • 2017-05-30
相关资源
最近更新 更多