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