1. オブジェクトのプロトタイプはオブジェクトであり、関数のプロトタイプもオブジェクトです
すべてのオブジェクトにはプロトタイプがあり、プロトタイプもオブジェクトです. プロトタイプ オブジェクトには多くの関数があります. プロトタイプを取得し、obj.__proto__ のメソッドを介してプロパティを追加できます. このプロトタイプで作成されたオブジェクトは、このプロパティを継承します. .
var person1 = {
name: "obj1",
age: 18,
}
var person2 ={// 字母量创建一个对象
gender: "girl"
}
person1.__proto__.perosnif = "是人类" // 给原型添加属性
console.log(person2.perosnif); // 是人类
console.log(person2.name); // undefined
console.log(person2.gender); // girl
属性を検索するときは、まず自身の属性を検索し、自身の属性が見つからない場合は (プロトタイプ チェーンに従って) プロトタイプに移動して検索し、見つからない場合は undefined を出力します。
関数のプロトタイプは関数ではなくオブジェクトであることに注意してください。fun.prototype を使用してプロトタイプを取得します。
function foo () {
}
console.log(foo.prototype); // {constructor: ƒ}
2. オブジェクトプロトタイプのメモリ性能
プロトタイプで sing 関数が定義されている場合、オブジェクトは直接使用でき、まったく同じです。
それらは両方とも、使用される同じメモリ上のプロトタイプオブジェクトのsing関数であるため
person1.__proto__.sing = function() {
console.log("singing");
}
console.log(person1.sing === person2.sing); // true
3. コンストラクターを使用してオブジェクトを作成する
関数を使用してオブジェクトを作成するには、新しい関数メソッドを使用します。
// Person 构造函数
function Person(name,age) { // 传入两个参数
this.name = name;
this.age = age;
this.sing = function() {
console.log("singing")
}
}
var person1 = new Person("张三",18)
ここで、2 番目のオブジェクトを作成するとき、内部の sing メソッドが異なることに注意してください。これは、Person が実行されるたびに、割り当てる新しい関数が再作成されるためです。
var person1 = new Person("张三",18)
var person2 = new Person("李四",19)
console.log(person1.sing === person2.sing); // false
メモリ性能は次のとおりです。
プロトタイプでメソッドを定義すると、次のように解決されます。
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.sing = function() {
console.log(this.name + " is singing");
}
var person1 = new Person("张三",18)
var person2 = new Person("李四",19)
console.log(person1.sing === person2.sing); // true
person1.sing() // 张三 is singing
メモリ性能: この時点で、同じプロトタイプ オブジェクト内のメソッドは共有されます