新しいオブジェクト()
直接コンストラクタで新しいオブジェクトを作成します。
var obj = new Object()
//等同于 var obj = {}
复制代码
実際に彼らが同じで、よりシンプルなリテラルの方法を使用してください。利点は欠点は、各オブジェクトが独立している、十分に単純です。
ファクトリパターン
function createObj(name,age){
var obj = {};
obj.name=name;
obj.age=age;
return obj
}
var Anson = createObj('Anson', 18)
console.log(Anson)
//{name: "Anson", age: 18}
复制代码
利点は欠点は、オブジェクトの種類を識別することができない、あなたは問題を解決するために、複数の類似したオブジェクトを作成することができます。
コンストラクタ
function Person(name,age){
this.name =name;
this.age=age;
this.sayName =function (){ alert(this.name) }
}
var person = new Person('小明',13);
console.log(person);
//Person {name: "小明", age: 13, sayName: ƒ}
复制代码
利点は、特定のオブジェクトの種類を作成することで、欠点は、この方法の複数のインスタンスを作成するために繰り返されます
(+コンストラクタプロトタイプ)複合モード
function Person(name, age){
this.name = name;
this.age = age;
Person.prototype.sayName = function (){ alert(this.name) }
}
var person = new Person('小白',18)
console.log(person);
//Person {name: "小白", age: 18} __proto__ -> sayName: ƒ ()
复制代码
複数のインスタンスは、一般的に使用されるプロトタイプの方法の利点を参照しました
ダイナミックプロトタイプ
function Person(name,age){
this.name=name
this.age =age
if(typeof this.sayName != 'function'){
Person.prototype.sayName = function(){ alert(this.name) }
}
}
var person = new Person('小红',15)
console.log(person);
//Person {name: "小红", age: 15} 动态创建sayName: ƒ ()
复制代码
利点は有効な方法は、最初のインスタンスに対して呼び出すメソッドは、すべてのインスタンスは、このアプローチを共有する場合にのみにのみ実行されます場合は、プロトタイプを初期化する必要性を決定するかどうかを決定することができ、注意すべき点は、プロトタイプを再することができないということですオブジェクト。
寄生コンストラクタモード
function Person(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name)
}
return o;
}
var friend=new Person("her",18,"Front-end Engineer");
friend.sayName();
//her
复制代码
使用に加えてnew
、オペレータ、および同じ機能の他の植物、オブジェクトコンストラクタのために作成することができます。
セーフモード
function Person(name, age){
var o={};
o.sayName=function(){ alert(name) }
return o;
}
var person = ('小亮',24);
person.sayName();//’小亮‘
复制代码
使用に加えて、person.sayName()
外部、名前の値にアクセスする方法はありません、そして特定のセキュリティパノラマの実装で使用するのに適し。
Object.create()
const person = {
isHuman: false,
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"
复制代码
__proto__、実装の継承の新しく作成されたオブジェクトを提供するために、既存のオブジェクトを使用して、新しいオブジェクトを作成し、プロトタイプオブジェクトを渡されました。
参考:「JavaScriptの高度なプログラミング第三版」、MDN
ます。https://juejin.im/post/5cf09e3751882552a826eed2で再現