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
的值并打印该值?
它是从全球范围调用的!?
答案 0 :(得分:2)
<强>问题:
我认为
var car = new Car()
实际上是在创建一个函数,我们用它来模拟传统OOP语言中的实例变量。如果这是正确的,
var car
应该是一个功能,并且有自己的范围&#39; 我们不能在外面访问它的变量。
<强>答案:
这两个陈述是错误的,因为你在这里混淆了object
和function
。
<强>解释
事实上,在您的情况下,Car
是Constructor
,也是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中RegExp
和object
之间的差异:
要查看function
和Object
之间的差异,请运行此代码段:
function
&#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 4
是Car
且其属性不在其范围之外可访问,但constructor/function
是一个对象,因此我们可以访问其属性。
答案 1 :(得分:1)
您在具有this
或prototype
的对象上定义的属性不是私有的。可以通过任何具有对实例的引用的函数来访问和修改它们。阅读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的更多信息。