gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:10:17 26 4
gpt4 key购买 nike

JavaScript 中的 new 关键字在第一次遇到时可能会让人很困惑,因为人们倾向于认为 JavaScript 不是一种面向对象的编程语言。

  • 这是什么?
  • 它解决了什么问题?
  • 什么时候合适,什么时候不合适?

最佳答案

它做了 5 件事:

  1. 它创建了一个新对象。这个对象的类型就是object
  2. 它将这个新对象的内部、不可访问的 [[prototype]](即 __proto__)属性设置为构造函数的外部、可访问的 prototype 对象(每个函数对象都自动具有 prototype 属性)。
  3. 它使 this 变量指向新创建的对象。
  4. 每当提到 this 时,它都会使用新创建的对象执行构造函数。
  5. 它返回新创建的对象,除非构造函数返回非null 对象引用。在这种情况下,将返回该对象引用。

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

new ConstructorFunction(arg1, arg2)

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

关于这点最困难的部分是第 2 点。每个对象(包括函数)都有这个称为 [[prototype]] 的内部属性。 only 可以在对象创建时设置,可以使用 newObject.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

在最终找到 this page 之前,我阅读了大量关于这个主题的垃圾信息,用漂亮的图表很好地解释了这一点。

关于javascript - JavaScript 中的 'new' 关键字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1646698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com