首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >新运算符在JavaScript中是如何工作的?

新运算符在JavaScript中是如何工作的?
EN

Stack Overflow用户
提问于 2011-07-20 00:48:57
回答 2查看 8.1K关注 0票数 42

站在原型链旁边,可能是JavaScript中最不被理解的部分。

所以问题是:如何……

代码语言:javascript
运行
复制
new dataObj(args); 

...actually创建一个对象,并定义它的原型链/构造器/等?

最好是展示一个替代方案,充分理解这个关键字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-20 01:00:11

new运算符使用内部的[[Construct]]方法,它基本上执行以下操作:

  • 初始化一个新的本机对象
  • 指向Function prototype属性设置此对象的内部[[Prototype]]
    • 如果函数的prototype属性不是对象(基元值,如数字、字符串、布尔值、未定义或Null),则使用

创建对象后,它会调用该函数,并将该对象作为基元值提供给

  • 。如果被调用函数的返回值是基元,则内部创建的对象为returned.
  • Otherwise,。
  • 如果返回对象,则内部创建的对象将丢失。

new运算符的等效实现可以表示为(假设ECMAScript 5 Object.create方法可用):

代码语言:javascript
运行
复制
function NEW(f) {
  var obj, ret, proto;

  // Check if `f.prototype` is an object, not a primitive
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Create an object that inherits from `proto`
  obj = Object.create(proto);

  // Apply the function setting `obj` as the `this` value
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  if (Object(ret) === ret) { // the result is an object?
    return ret;
  }
  return obj;
}

// Example usage:
function Foo (arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
obj.prop;          // 'bar'
obj.inherited;     // 'baz'
obj instanceof Foo // true
票数 58
EN

Stack Overflow用户

发布于 2011-07-20 00:58:19

expression new C(arg1, arg2)

假设C是一个JavaScript函数(否则你会得到一个错误):

  1. 创建一个新的空对象(no properties)
  2. Sets ),将新对象的原型设置为C的"prototype“属性的值。
    • 注意:函数的prototype的默认值是一个对象(在声明函数时自动创建),其原型设置为Object.prototype,并且一个constructor属性指向函数C.
    • Note:。术语可能会令人混淆。名为" prototype“的属性与对象的原型不同。只有函数具有名为"prototype“的属性,但所有对象都具有prototype.

  1. 调用函数C时,将'this‘设置为新对象,并使用提供的参数。
  2. 如果调用函数C返回一个对象,则此对象是表达式的结果。否则,新创建的对象将是表达式的结果。

ECMAScript 5中new的替代方法是使用内置的Object.createObject方法。

new C(arg1, arg2)等同于:

代码语言:javascript
运行
复制
var obj = Object.createObject(C.prototype);
C.apply(obj, [arg1, arg2]);

标准JavaScript不允许您显式设置对象的原型,因此Object.createObject不能在语言本身中实现。有些实现确实允许它通过非标准属性__proto__。在这种情况下,可以这样模拟new C

代码语言:javascript
运行
复制
var obj = {};
obj.__proto__ = C.prototype;
C.apply(obj, [arg1, arg2]);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6750880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档