Object.create()、new Object()と{}の違い
21297 ワード
この文は最初にhttps://lijing0906.github.io通常のコードでは必ずオブジェクトが使用され、通常は最も直接的な字面量の方法で
ダイレクトフォント量の作成
新キーワード作成
JSの指向問題でnewバインドについて
このように比較すると、実際には字面量作成とnewキーワード作成は区別されず、作成された新しいオブジェクトの
Object.create()
Object.create(proto[, propertiesObject]) は自分でObjectを実現した.create()
まとめ字面量と を継承する. を継承する.
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.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)
によって作成されたオブジェクトのプロトタイプは、arg
arg
がnull
であることに依存し、新しいオブジェクトは空のオブジェクトであり、プロトタイプがなく、オブジェクトを継承しない.arg
は指定オブジェクトであり、新しいオブジェクトのプロトタイプは指定オブジェクトを指し、指定オブジェクト