91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

JavaScript原型鏈有哪些方式

小樊
83
2024-10-31 05:31:53
欄目: 編程語言

JavaScript 原型鏈主要有以下幾種方式來查找和繼承屬性和方法:

  1. 原型鏈繼承(Prototype Chain Inheritance)

通過將子類的原型對象(prototype)設置為父類的一個實例,從而實現繼承。這種方式的優點是簡單易懂,但缺點是所有子類實例共享父類的引用屬性,無法實現多繼承。

function Parent() {
  this.name = 'parent';
}

Parent.prototype.getName = function() {
  return this.name;
};

function Child() {
  this.age = 18;
}

Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child1 = new Child();
console.log(child1.getName()); // 'parent'
  1. 構造函數繼承(Constructor Stealing)

在子類構造函數中調用父類構造函數,并將子類實例作為上下文(this)。這種方式的優點是可以避免子類實例共享父類引用屬性的問題,但缺點是無法繼承父類原型上的方法。

function Parent() {
  this.name = 'parent';
}

Parent.prototype.getName = function() {
  return this.name;
};

function Child() {
  Parent.call(this);
  this.age = 18;
}

var child1 = new Child();
console.log(child1.name); // 'parent'
console.log(child1.getName); // undefined
  1. 組合繼承(Combination Inheritance)

結合原型鏈繼承和構造函數繼承的優點,實現屬性和方法的繼承。缺點是父類構造函數會被調用兩次。

function Parent(name) {
  this.name = name;
}

Parent.prototype.getName = function() {
  return this.name;
};

function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child1 = new Child('parent', 18);
console.log(child1.name); // 'parent'
console.log(child1.getName()); // 'parent'
  1. 原型式繼承(Prototypal Inheritance)

通過創建一個新對象并將其原型設置為父類實例,實現繼承。這種方式的缺點是同樣會導致子類實例共享父類引用屬性。

function Parent() {
  this.name = 'parent';
}

Parent.prototype.getName = function() {
  return this.name;
};

function createObject(proto) {
  function F() {}
  F.prototype = proto;
  return new F();
}

var child1 = createObject(Parent.prototype);
child1.name = 'child';
console.log(child1.getName()); // 'child'
  1. 寄生式繼承(Parasitic Inheritance)

在原型式繼承的基礎上,增加一個函數用于封裝繼承過程并添加新的方法。這種方式的缺點仍然是子類實例共享父類引用屬性。

function Parent() {
  this.name = 'parent';
}

Parent.prototype.getName = function() {
  return this.name;
};

function createChild() {
  var clone = Object.create(Parent.prototype);
  clone.age = 18;
  return clone;
}

var child1 = createChild();
child1.name = 'child';
console.log(child1.getName()); // 'child'
  1. 寄生組合式繼承(Parasitic Combination Inheritance)

結合寄生式繼承和組合繼承的優點,避免了父類構造函數被調用兩次的問題。

function Parent(name) {
  this.name = name;
}

Parent.prototype.getName = function() {
  return this.name;
};

function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child1 = new Child('parent', 18);
console.log(child1.name); // 'parent'
console.log(child1.getName()); // 'parent'

0
云浮市| 晋江市| 黎平县| 五常市| 青阳县| 巴彦淖尔市| 临朐县| 锡林郭勒盟| 宜君县| 丰城市| 朝阳市| 上杭县| 彩票| 天峻县| 本溪| 滦平县| 江津市| 工布江达县| 昔阳县| 庄河市| 福泉市| 灵山县| 临沧市| 绥宁县| 清苑县| 通州市| 闽清县| 隆林| 文山县| 平阴县| 麻阳| 孝感市| 伊春市| 曲靖市| 宁津县| 博湖县| 中牟县| 图木舒克市| 东源县| 平定县| 奉贤区|