h5制作多少錢seo是怎么優(yōu)化上去
原型與原型鏈
- 原型
在js中,每個對象都有一個原型(prototype)。原型是一個對象,其他對象可以通過原型來共享屬性和方法。當(dāng)我們創(chuàng)建一個對象時,它會自動關(guān)聯(lián)到一個原型對象。
例如:
在上面的代碼中,創(chuàng)建了一個Person對象,有通過person創(chuàng)建了person1和person2對象,這兩個對象都關(guān)聯(lián)到function Person(name, age) { this.name = name; this.age = age; }// 在 Person 構(gòu)造函數(shù)的原型上添加一個 greet 方法 Person.prototype.greet = function() { console.log(`Hello, my name is ${this.name}.`); };const person1 = new Person('Alice', 30); const person2 = new Person('Bob', 25);person1.greet(); // 輸出 "Hello, my name is Alice." person2.greet(); // 輸出 "Hello, my name is Bob."
Person.prototype
原型對象,并且可以共享greet
方法。 - 原型鏈
原型鏈?zhǔn)歉E秱€對象通過原型鏈條連接在一起的數(shù)據(jù)結(jié)構(gòu)。當(dāng)訪問一個對象的屬性或方法時,js引擎會先在對象本身中尋找,如果找不到,就會沿著原型鏈繼續(xù)找,知道找到該屬性或方法,或者達(dá)到原型鏈的頂端(Object.prototype
)。
舉個例子:
function Person(name, age) {this.name = name;this.age = age;
}Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}.`);
};const person1 = new Person('Alice', 30);console.log(person1.toString()); // 輸出 "[object Object]"
在這個例子中 person1通過原型鏈繼承了toString方法。
所以是Object.prototype
原型鏈的頂端,它是所有對象的原型,包括內(nèi)置對象和自定義對象。當(dāng)查找屬性或方法時,原型鏈會一直往上查找,直到 Object.prototype
。如果在整個原型鏈上都找不到該屬性或方法,則返回 undefined
。
原型鏈繼承
原型繼承是通過原型鏈來實(shí)現(xiàn)對象間的屬性和方法共享。在原型繼承中,一個對象可以從另一個對象繼承屬性和方法,這樣可以實(shí)現(xiàn)對象之間的復(fù)用和擴(kuò)展。
原型繼承的基本概念如下:
- 每個 JavaScript 對象都有一個原型對象(prototype),它是一個普通對象。
- 當(dāng)訪問一個對象的屬性或方法時,如果該對象本身沒有該屬性或方法,JavaScript 引擎會沿著原型鏈向上查找,直到找到為止。
- 原型鏈?zhǔn)怯啥鄠€對象通過原型關(guān)聯(lián)形成的鏈條,最終的原型對象通常是
Object.prototype
,它是 JavaScript 中所有對象的原型。 - 如果在整個原型鏈上都找不到該屬性或方法,則返回
undefined
。
在原型繼承中,我們可以通過構(gòu)造函數(shù)的原型對象來共享屬性和方法。當(dāng)使用 new
關(guān)鍵字調(diào)用構(gòu)造函數(shù)創(chuàng)建對象時,新對象會關(guān)聯(lián)到該構(gòu)造函數(shù)的原型,從而繼承原型上的屬性和方法。
下面是一個使用原型繼承的簡單示例:
// 定義一個 Person 構(gòu)造函數(shù)
function Person(name) {this.name = name;
}// 在 Person 的原型上添加一個 greet 方法
Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}.`);
};// 使用 Person 構(gòu)造函數(shù)創(chuàng)建兩個對象
const person1 = new Person('Alice');
const person2 = new Person('Bob');// 調(diào)用對象的 greet 方法
person1.greet(); // 輸出 "Hello, my name is Alice."
person2.greet(); // 輸出 "Hello, my name is Bob."
在上面的代碼中,Person
構(gòu)造函數(shù)的原型對象上有一個 greet
方法,通過 new Person()
創(chuàng)建的對象(例如 person1
和 person2
)會共享這個方法。這樣,我們可以通過原型繼承在多個對象之間共享方法,提高代碼的重用性和可維護(hù)性。
需要注意的是,原型繼承只能繼承原型上的屬性和方法,而不能繼承構(gòu)造函數(shù)內(nèi)部的局部變量。如果需要更靈活的繼承方式,可以考慮其他方式,例如組合繼承、原型式繼承、寄生式繼承等。
js的其他繼承方式
- 組合繼承
組合繼承時結(jié)合了原型鏈繼承和構(gòu)造函數(shù)繼承的一種繼承方式。他通過在給子類的構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)來繼承父類的屬性,并通過將子類的原型指向一個新的創(chuàng)建的父類對象來繼承的方法。
function Parent(name) {this.name = name;
}Parent.prototype.greet = function() {console.log(`Hello, my name is ${this.name}.`);
};function Child(name, age) {Parent.call(this, name); // 構(gòu)造函數(shù)繼承this.age = age;
}Child.prototype = Object.create(Parent.prototype); // 原型鏈繼承
Child.prototype.constructor = Child;const child = new Child('Alice', 5);
child.greet(); // 輸出 "Hello, my name is Alice."
- 寄生式繼承
寄生式繼承是在原型式的基礎(chǔ)上增強(qiáng)新對象,添加額外的屬性和方法。
function createPerson(proto, age) {const newPerson = createObject(proto); // 原型式繼承newPerson.age = age; // 增強(qiáng)對象newPerson.introduce = function() {console.log(`I am ${this.name} and I am ${this.age} years old.`);};return newPerson;
}const person = {name: 'Alice',greet: function() {console.log(`Hello, my name is ${this.name}.`);}
};const newPerson = createPerson(person, 30);
newPerson.greet(); // 輸出 "Hello, my name is Alice."
newPerson.introduce(); // 輸出 "I am Alice and I am 30 years old."
- 寄生組合式繼承
寄生組合式繼承是對組合繼承的一種優(yōu)化,通過構(gòu)造函數(shù)繼承屬性,同時利用Object.create()方法來繼承原型,避免了調(diào)用父類構(gòu)造函數(shù)時產(chǎn)生的不必要的屬性重復(fù)賦值問題。
function Parent(name) {this.name = name;
}Parent.prototype.greet = function() {console.log(`Hello, my name is ${this.name}.`);
};function Child(name, age) {Parent.call(this, name); // 構(gòu)造函數(shù)繼承this.age = age;
}Child.prototype = Object.create(Parent.prototype); // 原型鏈繼承
Child.prototype.constructor = Child;const child = new Child('Alice', 5);
child.greet(); // 輸出 "Hello, my name is Alice."
- 構(gòu)造函數(shù)式繼承
function Animal(name) {this.name = name;
}function Dog(name, breed) {Animal.call(this, name);this.breed = breed;
}const dog = new Dog('Buddy', 'Golden Retriever');
console.log(dog.name); // 輸出 "Buddy"