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

Javascript 为什么我们可以访问构造函数创建的实例的属性?,javascript,function,variables,scope,Javascript,Function,Variables,Scope,我是javascript新手,我试图理解范围的概念 这里Car被分配了一个函数,我们称之为构造函数。var车=新车;创建所谓汽车类的实例 我认为var car=new car实际上是在创建一个函数,我们用它来模拟传统OOP语言中的实例变量 如果这是正确的,var car应该是一个函数,它有自己的“作用域”,我们不能在外部访问它的变量 那么,为什么最后一个表达式可以得到car.wheels的值并打印该值呢? 它是从全局范围调用的 使用此或原型在对象上定义的属性不是私有的。它们可以被引用实例的任何函

我是javascript新手,我试图理解范围的概念

这里Car被分配了一个函数,我们称之为构造函数。var车=新车;创建所谓汽车类的实例

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

如果这是正确的,var car应该是一个函数,它有自己的“作用域”,我们不能在外部访问它的变量

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

使用此或原型在对象上定义的属性不是私有的。它们可以被引用实例的任何函数访问和修改。阅读以了解javascript中私有变量的概念

下面的示例显示了一种可能的方法,可以使控制盘私有,并将getWheels函数公开为公共getWheelsPublic。还有更多的模式

var Car=功能车轮{ var私家车; 功能设置车轮车轮车轮{ 私家车=轮子; } 函数getWheels{ 返回私家车 } 轮对轮; 返回{ getWheelsPublic:getWheels } }; var car=新Car4; var car2=新的Car3; console.logcar.getwheelsublic,car2.getwheelsublic//4 3
控制台、logcar、私人车轮//未定义使用此或原型在对象上定义的属性不是私有的。它们可以被引用实例的任何函数访问和修改。阅读以了解javascript中私有变量的概念

下面的示例显示了一种可能的方法,可以使控制盘私有,并将getWheels函数公开为公共getWheelsPublic。还有更多的模式

var Car=功能车轮{ var私家车; 功能设置车轮车轮车轮{ 私家车=轮子; } 函数getWheels{ 返回私家车 } 轮对轮; 返回{ getWheelsPublic:getWheels } }; var car=新Car4; var car2=新的Car3; console.logcar.getwheelsublic,car2.getwheelsublic//4 3
控制台、logcar、私人车轮//undefined函数定义了一个作用域,并且所有变量都是它的局部变量,这是正确的。但是,函数也有上下文,您可以通过this操作符访问上下文。上下文是基于对象的,JS中的对象是通过原型创建的。在您的示例中,函数充当对象的构造函数,这就是对象上下文。所以当你这样做的时候:

var Car=功能轮{ var _wheels=wheels;//函数范围 this.wheels=\u wheels;//上下文 }; Car.prototype.getWheels=函数{ 返回this.wheels;//上下文 } var car=新Car4; var car2=新的Car3; 控制台。小车。车轮,小车2。车轮//4 3
console.logcar.getWheels您是对的,函数定义了一个作用域,并且所有变量都是它的局部变量。但是,函数也有上下文,您可以通过this操作符访问上下文。上下文是基于对象的,JS中的对象是通过原型创建的。在您的示例中,函数充当对象的构造函数,这就是对象上下文。所以当你这样做的时候:

var Car=功能轮{ var _wheels=wheels;//函数范围 this.wheels=\u wheels;//上下文 }; Car.prototype.getWheels=函数{ 返回this.wheels;//上下文 } var car=新Car4; var car2=新的Car3; 控制台。小车。车轮,小车2。车轮//4 3 console.logcar.getWheels问题:

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

如果这是正确的,var car应该是一个函数,并且有自己的“作用域” 我们不能访问它的外部变量

答复:

这两条语句是错误的,因为您在这里混淆了对象和函数

说明:

事实上,在您的例子中,Car是一个构造函数,也是一个函数,但是var Car=new Car中的Car不像您所说的那样是一个函数,而是一个使用Car构造函数创建的对象,因为new关键字使用Car构造函数创建了一个新的实例对象

例如,如果我们写:

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

var car = new Car();
console.log(car.wheels);
这里有两个对象,因为我们使用Date和regexp构造函数创建了两个新对象

JS中对象和函数的区别:

要查看对象和函数之间的差异,请运行以下代码段:

var Car=功能{ 这是4个轮子; }; console.logCar.wheels:+Car.wheels//你会得到未定义的 var车=新车; console.logcar.wheels:+car.wheels//您将得到4个问题:

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

如果这是正确的,var car应该是一个函数,并且有自己的“scop” e' 我们不能访问它的外部变量

答复:

这两条语句是错误的,因为您在这里混淆了对象和函数

说明:

事实上,在您的例子中,Car是一个构造函数,也是一个函数,但是var Car=new Car中的Car不像您所说的那样是一个函数,而是一个使用Car构造函数创建的对象,因为new关键字使用Car构造函数创建了一个新的实例对象

例如,如果我们写:

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

var car = new Car();
console.log(car.wheels);
这里有两个对象,因为我们使用Date和regexp构造函数创建了两个新对象

JS中对象和函数的区别:

要查看对象和函数之间的差异,请运行以下代码段:

var Car=功能{ 这是4个轮子; }; console.logCar.wheels:+Car.wheels//你会得到未定义的 var车=新车;

console.logcar.wheels:+car.wheels//你会得到4块钱。看来你对我的问题有误解。我知道实例可以有自己的属性。实际上,我的问题是为什么这些属性可以从全局范围访问,因为它们位于自己的函数范围内?我认为它们应该是局部变量?这主要是因为在您的例子中,由它定义的属性被添加为该对象上的属性,并且不是私有的。它不遵循词汇范围。但是使用var声明的变量将根据您的需要遵循词法范围。因此,要回答这个问题,它们不在car的函数/词法范围内,而只是car对象的属性,在所有可以引用car的地方都可以访问这些属性。谢谢。看来你对我的问题有误解。我知道实例可以有自己的属性。实际上,我的问题是为什么这些属性可以从全局范围访问,因为它们位于自己的函数范围内?我认为它们应该是局部变量?这主要是因为在您的例子中,由它定义的属性被添加为该对象上的属性,并且不是私有的。它不遵循词汇范围。但是,使用var声明的变量将按照您的意愿进行词法作用域。因此,要回答这个问题,它们不在car的函数/词法范围内,而只是car对象的属性,在所有可以引用car的地方都可以访问这些属性。原始代码片段的功劳归于sabithpocker,当然:原始代码段的DCredit转到sabithpocker,当然:DBut在JS函数中也是对象?是的,在JavaScript中,一切都可以被视为对象,但是如果您编写var Car=function{this.wheels=4;};然后是控制台。车辆的日志类型;您将获得函数。@Jinglei.Y但并非所有对象都是函数@奥利奥:是的。我想你指的是数字和字符串等基本类型。我想我误解了新运算符。我刚刚查阅了文档,它说新操作符创建了一个用户定义对象类型的实例,或者一个具有构造函数的内置对象类型的实例。我认为它复制了一些东西,这就是为什么我认为car是一个函数。但在JS中,函数也是对象?是的,在JavaScript中,一切都可以被视为对象,但是如果你写var car=function{this.wheels=4;};然后是控制台。车辆的日志类型;您将获得函数。@Jinglei.Y但并非所有对象都是函数@奥利奥:是的。我想你指的是数字和字符串等基本类型。我想我误解了新运算符。我刚刚查阅了文档,它说新操作符创建了一个用户定义对象类型的实例,或者一个具有构造函数的内置对象类型的实例。我认为它复制了一些东西,这就是为什么我认为汽车是一种功能。不,它不是一种功能。你为什么这么认为?@Oriol在JS函数中也是对象。所以汽车无疑是一个物体。但我认为,除此之外,它是一种“功能”,它有它的范围。所以我认为这是一个更具体的函数,你的逻辑是错误的。在JS中函数也是对象并不意味着在JS中对象也是函数。汽车不是功能,汽车是。汽车没有任何类似功能的行为。为什么它能检索到你明确要求的东西?!!因为这是它们存在的唯一原因,也是唯一使它们有用的东西。var car是您的全局变量,它引用了您刚刚构造的对象,这个对象的句柄是“car”,当然它的值是4。@Oriol我同意JS中的对象也是函数是错误的。我认为这是因为我认为汽车是一个“功能对象”,而不是一个“传统”的对象,导致我原来的问题。我所能想到的就是当执行var car=newcar时,调用分配给car变量的函数。车上有东西。当新车被执行时会发生什么?它不返回任何东西?不,它不是函数。你为什么这么认为?@Oriol在JS函数中也是对象。所以汽车无疑是一个物体。但我认为,除此之外,它是一种“功能”,而且它具有
它的范围。所以我认为这是一个更具体的函数,你的逻辑是错误的。在JS中函数也是对象并不意味着在JS中对象也是函数。汽车不是功能,汽车是。汽车没有任何类似功能的行为。为什么它能检索到你明确要求的东西?!!因为这是它们存在的唯一原因,也是唯一使它们有用的东西。var car是您的全局变量,它引用了您刚刚构造的对象,这个对象的句柄是“car”,当然它的值是4。@Oriol我同意JS中的对象也是函数是错误的。我认为这是因为我认为汽车是一个“功能对象”,而不是一个“传统”的对象,导致我原来的问题。我所能想到的就是当执行var car=newcar时,调用分配给car变量的函数。车上有东西。当新车被执行时会发生什么?它没有返回任何东西?