为什么我们可以访问构造函数创建的实例的属性?

时间:2016-12-10 09:38:46

标签: javascript function variables scope

var Car = function () {
    this.wheels = 4;
};

var car = new Car();
console.log(car.wheels);

我是javascript的新手,我试图了解scope的概念。

这里为Car分配了一个我们称之为构造函数的函数。 var car = new Car();创建了一个所谓的Car类的实例。

我认为var car = new Car()实际上是在创建一个函数,我们用它来模拟传统OOP语言中的实例变量

如果这是正确的,var car应该是一个功能,并且有自己的范围'我们不能在外面访问它的变量。

那么为什么最后一个表达式可以获得car.wheels的值并打印该值? 它是从全球范围调用的!?

3 个答案:

答案 0 :(得分:2)

<强>问题:

  

我认为var car = new Car()实际上是在创建一个函数,我们用它来模拟传统OOP语言中的实例变量。

     

如果这是正确的,var car应该是一个功能,并且有自己的范围&#39;   我们不能在外面访问它的变量。

<强>答案:

这两个陈述是错误的,因为你在这里混淆了objectfunction

<强>解释

事实上,在您的情况下,CarConstructor,也是function,但car 中的var car = new Car()不是{{} 1}}就像你说的那样,它是使用function构造函数创建的object ,因为Car关键字会创建一个新实例new使用object构造函数。

例如,如果我们写:

Car

我们在这里有两个对象,因为我们使用var today = new Date(); console.log(typeof today); //returns object var reg = new RegExp('\\w+'); console.log(typeof reg); //returns object Date构造函数来创建两个新对象。

JS中RegExpobject之间的差异:

要查看functionObject之间的差异,请运行此代码段:

&#13;
&#13;
function
&#13;
&#13;
&#13;

由于var Car = function () { this.wheels = 4; }; console.log("Car.wheels: "+Car.wheels);//You will get undefined var car = new Car(); console.log("car.wheels: "+car.wheels);//You will get 4Car且其属性不在其范围之外可访问,但constructor/function是一个对象,因此我们可以访问其属性。

答案 1 :(得分:1)

您在具有thisprototype的对象上定义的属性不是私有的。可以通过任何具有对实例的引用的函数来访问和修改它们。阅读this article以了解javascript中的私有变量。

以下示例显示一种可能的方式,了解如何将wheels设为私有,并将getWheels功能公开为公开getWheelsPublic。还有更多模式documented here

var Car = function(wheels) {
  var privateWheels;

  function setWheels(wheels) {
    privateWheels = wheels;
  }

  function getWheels() {
    return privateWheels
  }
  setWheels(wheels);

  return {
    getWheelsPublic: getWheels
  }
};

var car = new Car(4);
var car2 = new Car(3);
console.log(car.getWheelsPublic(), car2.getWheelsPublic()); //4 3
console.log(car.privateWheels); //undefined

如果你看看你在下面的片段({"wheels": 4})的结果中创建的实例,你可以立即看到轮子在该对象中作为属性可用而不与函数的词法范围相关联。另请注意,词法范围中的privateOwner无法从外部获得。

var Car = function () {
    this.wheels = 4;
    var privateOwner = "SabithPocker"
};

var car = new Car();
console.log(car); //{"wheels": 4} 

答案 2 :(得分:1)

你是对的,函数定义了一个范围,并且所有变量都是本地变量。但是,函数还具有 context ,这是您通过this运算符访问的内容。 Context是基于对象的,JS中的对象是通过原型创建的。在您的示例中,function充当对象的构造函数,this是对象上下文。所以当你这样做时:

var Car = function (wheels) {
  var _wheels = wheels; // Function scope
    this.wheels = _wheels; // context
};

Car.prototype.getWheels = function(){
  return this.wheels; // Context
 }

var car = new Car(4);
var car2 = new Car(3);
console.log(car.wheels, car2.wheels);//4 3

console.log(car.getWheels())

您正在使用上下文。

您可以阅读有关此in this article的更多信息。