在new
JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。
- 它是什么?
- 它解决什么问题?
- 什么时候合适,什么时候不合适?
在new
JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。
的new
关键字改变正在运行在其下的功能的上下文和指针返回到该上下文。
当您不使用new
关键字时,函数在其下Vehicle()
运行的上下文与您从中调用该Vehicle
函数的上下文相同。该this
关键字将指向同一个语境。当您使用时new Vehicle()
,会创建一个新上下文,因此this
函数内的关键字引用了新上下文。作为回报,您将获得新创建的上下文。
的new
关键字以JavaScript用于创建从一个构造函数的对象。该new
关键字的构造函数调用之前放置,并会做以下几件事:
this
关键字绑定到新创建的对象并执行构造函数function Dog (age) {
this.age = age;
}
const doggie = new Dog(12);
console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true
到底发生了什么:
const doggie
说:我们需要内存来声明变量。=
说:我们将使用=
new Dog(12)
。JS引擎看到new关键字,创建一个新对象并将原型设置为Dog.prototypethis
设置为新对象的值执行构造函数。在此步骤中,将年龄分配给新创建的小狗对象。Javascript是一种动态编程语言,它支持面向对象的编程范例,并且用于创建对象的新实例。
类对于对象不是必需的-Javascript是一种基于原型的语言。
在浏览器控制台中尝试以下代码。
function Foo() {
return this;
}
var a = Foo(); //returns window object
var b = new Foo(); //returns empty object of foo
a instanceof Window; // true
a instanceof Foo; // false
b instanceof Window; // false
b instanceof Foo; // true
现在您可以阅读社区Wiki答案了:)
JavaScript 是一种面向对象的编程语言,它完全用于创建实例。它是基于原型的,而不是基于类的,但这并不意味着它不是面向对象的。
假设您具有以下功能:
var Foo = function(){
this.A = 1;
this.B = 2;
};
如果您将其称为独立函数,例如:
Foo();
执行此功能将为window
对象(A
和B
)添加两个属性。window
之所以将其添加到,是因为window
这样执行时调用该函数的对象,而this
在函数中是调用该函数的对象。至少在Javascript中。
现在,用这样的方式调用它new
:
var bar = new Foo();
当您添加new
到函数调用中时,会发生一个新对象(只是var bar = new Object()
)的创建,this
并且函数内的指向Object
刚创建的新对象,而不是指向调用该函数的对象。所以,bar
现在与属性的对象A
和B
。任何函数都可以是构造函数,但这并不总是很有意义。
除了丹尼尔·霍华德(Daniel Howard)的答案,这是做什么的new
(或者至少看起来是这样做的):
function New(func) {
var res = {};
if (func.prototype !== null) {
res.__proto__ = func.prototype;
}
var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
return ret;
}
return res;
}
而
var obj = New(A, 1, 2);
相当于
var obj = new A(1, 2);
该
new
关键字是创建新的对象实例。是的,javascript是一种动态编程语言,它支持面向对象的编程范例。关于对象命名的约定是,对于应该由new关键字实例化的对象,始终使用大写字母。