JavaScript中的新关键字在第一次遇到时可能会非常令人困惑,因为人们倾向于认为JavaScript不是一种面向对象的编程语言。
这是怎么一回事?它解决了什么问题?什么时候合适,什么时候不合适?
JavaScript中的新关键字在第一次遇到时可能会非常令人困惑,因为人们倾向于认为JavaScript不是一种面向对象的编程语言。
这是怎么一回事?它解决了什么问题?什么时候合适,什么时候不合适?
当前回答
所以它可能不是为了创造对象的实例
它正是为了这个。您可以这样定义函数构造函数:
function Person(name) {
this.name = name;
}
var john = new Person('John');
然而,ECMAScript的额外好处是您可以使用.prototype属性进行扩展,因此我们可以执行以下操作。。。
Person.prototype.getName = function() { return this.name; }
从该构造函数创建的所有对象现在都将有一个getName,因为它们可以访问原型链。
其他回答
假设您有此函数:
var Foo = function(){
this.A = 1;
this.B = 2;
};
如果将其作为独立函数调用,如下所示:
Foo();
执行此函数将向窗口对象(A和B)添加两个财产。它将其添加到窗口中,因为当您这样执行函数时,window是调用函数的对象,而函数中的this是调用该函数的对象。至少在JavaScript中。
现在,用新的:
var bar = new Foo();
当您向函数调用添加新对象时,将创建一个新对象(仅var bar=new object()),并且函数中的this指向您刚刚创建的新对象,而不是调用函数的对象。所以bar现在是一个具有财产A和B的对象。任何函数都可以是构造函数;这并不总是有意义的。
JavaScript是一种面向对象的编程语言,它完全用于创建实例。它是基于原型的,而不是基于类的,但这并不意味着它不是面向对象的。
让初学者更好地理解它
在浏览器控制台中尝试以下代码。
function Foo() {
return this;
}
var a = Foo(); // Returns the 'window' object
var b = new Foo(); // Returns an empty object of foo
a instanceof Window; // True
a instanceof Foo; // False
b instanceof Window; // False
b instanceof Foo; // True
现在您可以阅读社区wiki答案:)
它有三个阶段:
1.创建:它创建一个新对象,并将此对象的[[prototype]]属性设置为构造函数的prototype属性。
2.执行:它指向新创建的对象并执行构造函数。
3.返回:在正常情况下,它将返回新创建的对象。但是,如果显式返回非空对象或函数,则会返回此值。需要提及的是,如果返回非空值,但它不是对象(例如Symbol value、undefined、NaN),则忽略该值并返回新创建的对象。
function myNew(constructor, ...args) {
const obj = {}
Object.setPrototypeOf(obj, constructor.prototype)
const returnedVal = constructor.apply(obj, args)
if (
typeof returnedVal === 'function'
|| (typeof returnedVal === 'object' && returnedVal !== null)) {
return returnedVal
}
return obj
}
有关myNew的更多信息和测试,请阅读我的博客:https://medium.com/@magenta2127/how-does-the-new-operator-work-f7eaac692026
JavaScript是一种支持面向对象编程范式的动态编程语言,用于创建对象的新实例。
对象不需要类。JavaScript是一种基于原型的语言。