Object.create()、new Object()と{}の違い

21297 ワード

この文は最初にhttps://lijing0906.github.io通常のコードでは必ずオブジェクトが使用され、通常は最も直接的な字面量の方法でvar obj = {}を作成し、最近JS継承方式を整理する際にObject.create()に遭遇してもオブジェクトを作成することができ、またnew Object()キーワードで作成することもできる.では、この3つの方法には違いがありますか?
ダイレクトフォント量の作成
var objA = {};
objA.name = 'a';
objA.sayName = function() {
    console.log(`My name is ${this.name} !`);
}
// var objA = {
//     name: 'a',
//     sayName: function() {
//         console.log(`My name is ${this.name} !`);
//     }
// }
objA.sayName();
console.log(objA.__proto__ === Object.prototype); // true
console.log(objA instanceof Object); // true

新キーワード作成
var objB = new Object();
// var objB = Object();
objB.name = 'b';
objB.sayName = function() {
    console.log(`My name is ${this.name} !`);
}
objB.sayName();
console.log(objB.__proto__ === Object.prototype); // true
console.log(objB instanceof Object); // true

JSの指向問題でnewバインドについてnewオペレータが実際に次の4つのステップを行いました.
var obj = new Object(); //        
obj.__proto__ = F.prototype; // obj __proto__       prototype
var result = F.call(obj); //       this  obj,             result
if (typeof(result) === 'object') {
    objB = result; //     F          ,              objB
} else {
    objB = obj; //     F         ,   obj      objB
}

このように比較すると、実際には字面量作成とnewキーワード作成は区別されず、作成された新しいオブジェクトの__proto__Object.prototypeを指しているが、字面量作成はより効率的であり、__proto__が割り当て値とthisを指していない.
Object.create() Object.create()メソッドは、既存のオブジェクトを使用して新しく作成されたオブジェクトの__proto__を提供する新しいオブジェクトを作成します.MDN
const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};
const me = Object.create(person); // me.__proto__ === person
me.name = "Matthew"; // name         me ,       person 
me.isHuman = true; //           
me.printIntroduction(); // My name is Matthew. Am I human? true

Object.create(proto[, propertiesObject])
  • proto必須パラメータは、上記のコードの新しいオブジェクトme__proto__personを指すように、新しいオブジェクトのプロトタイプオブジェクトです.なお、このパラメータがnullである場合、Object.prototypeなどのhasOwnProperty()、toString()上の属性や方法は、新しいオブジェクトは完全に空のオブジェクトであり、継承されていない.
  • var a = Object.create(null);
    console.dir(a); // {}
    console.log(a.__proto__); // undefined
    console.log(a.__proto__ === Object.prototype); // false
    console.log(a instanceof Object); // false     `Object.prototype`         ,          Object
    
  • propertiesObjectはオプションのパラメータであり、新しいオブジェクトに追加する列挙可能な属性(すなわち、そのカスタム属性およびメソッド、hasOwnProperty()で取得可能であり、プロトタイプオブジェクトではなく)の記述子および対応する属性名を指定します.
  • var bb = Object.create(null, {
        a: {
            value: 2,
            writable: true,
            configurable: true
        }
    });
    console.dir(bb); // {a: 2}
    console.log(bb.__proto__); // undefined
    console.log(bb.__proto__ === Object.prototype); // false
    console.log(bb instanceof Object); // false     `Object.prototype`         ,          Object
    
    // ----------------------------------------------------------
    
    var cc = Object.create({b: 1}, {
        a: {
            value: 3,
            writable: true,
            configurable: true
        }
    });
    console.log(cc); // {a: 3}
    console.log(cc.hasOwnProperty('a'), cc.hasOwnProperty('b')); // true false                       
    console.log(cc.__proto__); // {b: 1}    cc __proto__  {b: 1}
    console.log(cc.__proto__ === Object.protorype); // false
    console.log(cc instanceof Object); // true cc   ,         Object
    
    Object.create()によって作成されたオブジェクトのプロトタイプは、入力されたオブジェクトを指します.文字数とnewキーワードの作成とは異なります.
  • は自分でObjectを実現した.create()
  • Object.mycreate = function(proto, properties) {
        function F() {};
        F.prototype = proto;
        if(properties) {
            Object.defineProperties(F, properties);
        }
        return new F();
    }
    var hh = Object.mycreate({a: 11}, {mm: {value: 10}});
    console.dir(hh);
    

    まとめ
  • 字面量とnewキーワードで作成するオブジェクトはObjectの例であり、プロトタイプはObject.prototypeを指し、内蔵オブジェクトObject
  • を継承する.
  • Object.create(arg, pro)によって作成されたオブジェクトのプロトタイプは、argargnullであることに依存し、新しいオブジェクトは空のオブジェクトであり、プロトタイプがなく、オブジェクトを継承しない.argは指定オブジェクトであり、新しいオブジェクトのプロトタイプは指定オブジェクトを指し、指定オブジェクト
  • を継承する.