Pic*_*tor 40 javascript oop object new-operator
可能是JavaScript中最不被理解的部分,站在原型链旁边.
所以问题是:怎么做......
new dataObj(args); 
Run Code Online (Sandbox Code Playgroud)
...实际创建一个对象,并定义其原型链/构造函数/等?
最好是展示一个替代方案,以完全理解这个关键字.
CMS*_*CMS 52
的new操作者使用内部[[Construct]]方法,它基本上具有以下功能:
[[Prototype]]此对象的内部,指向Function prototype属性.
prototype属性不是对象(原始值,例如Number,String,Boolean,Undefined或Null),Object.prototype则使用它.this值.new操作符的等效实现可以这样表达(假设ECMAScript 5 Object.create方法可用):
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
Run Code Online (Sandbox Code Playgroud)
        表达式new C(arg1, arg2):
假设C是一个JavaScript函数(否则会出错):
prototype"属性的值C. 
prototype函数的默认值是一个对象(在声明函数时自动创建),其原型设置为Object.prototype和constructor指向函数的属性C.C与" this"设置为新的对象,并使用所提供的参数.C返回一个对象,则该对象是表达式的结果.否则,新创建的对象是表达式的结果.new在ECMAScript 5中的替代方案是使用内置Object.createObject方法.
new C(arg1, arg2) 相当于:
var obj = Object.createObject(C.prototype);
C.apply(obj, [arg1, arg2]);
Run Code Online (Sandbox Code Playgroud)
标准JavaScript不允许您显式设置对象的原型,因此Object.createObject无法在语言本身中实现.某些实现确实允许它通过非标准属性__proto__.在这种情况下,new C可以这样模拟:
var obj = {};
obj.__proto__ = C.prototype;
C.apply(obj, [arg1, arg2]);
Run Code Online (Sandbox Code Playgroud)