为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript中的'new'关键字是什么?

JavaScript中的'new'关键字是什么?

有只小跳蛙 2019-05-27 09:55:20
JavaScript中的'new'关键字是什么?newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言。它是什么?它解决了什么问题?什么时候适当,什么时候不适合?
查看完整描述

4 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞


让初学者更好地理解它

在浏览器控制台中尝试以下代码。


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的答案 :)


查看完整回答
反对 回复 2019-05-27
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞


它做了5件事:


它创建了一个新对象。该对象的类型只是对象。

它将此新对象的内部,不可访问,[[prototype]](即__ proto__)属性设置为构造函数的外部可访问原型对象(每个函数对象自动具有原型属性)。

它使this变量指向新创建的对象。

它执行构造函数,只要this提到就使用新创建的对象。

它返回新创建的对象,除非构造函数返回非null对象引用。在这种情况下,将返回该对象引用。

注意:构造函数是指new关键字后面的函数,如


new ConstructorFunction(arg1, arg2)

完成此操作后,如果请求新对象的未定义属性,脚本将检查该对象的[[prototype]]对象。这就是你如何在JavaScript中获得类似于传统类继承的东西。


关于这一点最困难的部分是第2点。每个对象(包括函数)都有一个名为[[prototype]]的内部属性。它只能在对象创建时设置,可以是new,使用Object.create,也可以是基于文字(函数默认为Function.prototype,数字为Number.prototype等)。它只能用Object.getPrototypeOf(someObject)读取。有没有其他的方式来设置或读取此值。


除了[[prototype]]属性之外,函数还有一个名为prototype的属性,您可以访问和修改这些属性,为您创建的对象提供继承的属性和方法。


这是一个例子:


ObjMaker = function() {this.a = 'first';};

// ObjMaker is just a function, there's nothing special about it that makes 

// it a constructor.


ObjMaker.prototype.b = 'second';

// like all functions, ObjMaker has an accessible prototype property that 

// we can alter. I just added a property called 'b' to it. Like 

// all objects, ObjMaker also has an inaccessible [[prototype]] property

// that we can't do anything with


obj1 = new ObjMaker();

// 3 things just happened.

// A new, empty object was created called obj1.  At first obj1 was the same

// as {}. The [[prototype]] property of obj1 was then set to the current

// object value of the ObjMaker.prototype (if ObjMaker.prototype is later

// assigned a new object value, obj1's [[prototype]] will not change, but you

// can alter the properties of ObjMaker.prototype to add to both the

// prototype and [[prototype]]). The ObjMaker function was executed, with

// obj1 in place of this... so obj1.a was set to 'first'.


obj1.a;

// returns 'first'

obj1.b;

// obj1 doesn't have a property called 'b', so JavaScript checks 

// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype

// ObjMaker.prototype has a property called 'b' with value 'second'

// returns 'second'

这就像类继承一样,因为现在,您使用的任何对象new ObjMaker()也似乎都继承了'b'属性。


如果你想要类似子类的东西,那么你这样做:


SubObjMaker = function () {};

SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!

// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype

// is now set to the object value of ObjMaker.prototype.

// The modern way to do this is with Object.create(), which was added in ECMAScript 5:

// SubObjMaker.prototype = Object.create(ObjMaker.prototype);


SubObjMaker.prototype.c = 'third';  

obj2 = new SubObjMaker();

// [[prototype]] property of obj2 is now set to SubObjMaker.prototype

// Remember that the [[prototype]] property of SubObjMaker.prototype

// is ObjMaker.prototype. So now obj2 has a prototype chain!

// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype


obj2.c;

// returns 'third', from SubObjMaker.prototype


obj2.b;

// returns 'second', from ObjMaker.prototype


obj2.a;

// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 

// was created with the ObjMaker function, which assigned a for us

在最终找到这个页面之前,我读了很多关于这个主题的垃圾,这里用漂亮的图表很好地解释了这个问题。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 674 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信