国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

理解js對象繼承的N種模式

2019-11-20 10:42:43
字體:
供稿:網(wǎng)友

本文分享了js對象繼承的N種模式,供大家參考。

一、原型鏈繼承

function Person(){};Person.prototype = {  constructor: Person,  name: "Oliver"};    function People(){};People.prototype = new Person();People.prototype.constructor = People;People.prototype.sayName = function(){  return this.name;};var ins = new People();console.log(ins.sayName());

二、借用構(gòu)造函數(shù)(偽造對象,經(jīng)典繼承)

1、無參數(shù)

function SuperType(){  this.color = ["red","yellow","white"];}function SubType(){  SuperType.call(this);}var instance1 = new SubType();var instance2 = new SubType();instance1.color.pop();console.log(instance1.color); //["red", "yellow"]console.log(instance2.color); //["red", "yellow", "white"]

2、有參數(shù)

function SuperType(name){  this.name = name;  this.number = [21,32,14,1];}function SubType(name,age){  SuperType.call(this,name);  this.age = age;}var instance1 = new SubType("Oliver",18);var instance2 = new SubType("Troy",24);instance2.number.pop();console.log(instance1.name + instance1.age + instance1.number); //Oliver1821,32,14,1console.log(instance2.name + instance2.age + instance2.number); //Troy2421,32,14

三、組合繼承(偽經(jīng)典繼承)

1、無參數(shù)

function SuperType(){  this.color = ["red","yellow","white"];}SuperType.prototype.sayColor = function(){  return this.color;};function SubType(){  SuperType.call(this);  this.number = 321;}SubType.prototype = new SuperType();SubType.prototype.constructor = SubType;SubType.prototype.sayNumber = function(){  return this.number;};var instance1 = new SubType();var instance2 = new SubType();instance2.color.pop();console.log(instance1.color + instance1.number); //red,yellow,white321console.log(instance2.color + instance2.number); //red,yellow321

2、有參數(shù)

function SuperType(name){  this.name = name;  this.number = [32,1342,11,1];}SuperType.prototype.sayName = function(){  return this.name;};function SubType(name,age){  SuperType.call(this,name);  this.age = age;}SubType.prototype = new SuperType();SubType.prototype.constructor = SubType;SubType.prototype.sayAge = function(){  return this.age;};var instance1 = new SubType("Oliver",18);var instance2 = new SubType("Troy",24);instance2.number.pop();console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver1832,1342,11,1console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy2432,1342,11

三、寄生組合式繼承(引用類型最理想的范式)

function inheritPrototype(subType,superType){  var prototype = Object(superType.prototype);  prototype.constructor = subType;  subType.prototype = prototype;}function SuperType(name){  this.name = name;  this.number = [321,321,43];}SuperType.prototype.sayName = function(){  return this.name;};function SubType(name,age){  SuperType.call(this,name);  this.age = age;}inheritPrototype(SubType,SuperType);SubType.prototype.sayAge = function(){  return this.age;};var instance1 = new SubType("Oliver",18);var instance2 = new SubType("Troy",24);instance2.number.pop();console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver18321,321,43console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy24321,321

或者可以把inheritPrototype 函數(shù)寫成下面這樣:

function inheritPrototype(SubType,SuperType){  SubType.prototype = new SuperType();  SubType.prototype.constructor = SubType;}

四、原型式繼承(用于共享引用類型的值,與寄生式類似)

1、傳統(tǒng)版(先定義object() 函數(shù),再繼承)

function object(o){  function F(){};  F.prototype = o;  return new F();}var SuperType = {  name: "Oliver",  number: [321,321,4532,1]};var SubType1 = object(SuperType);var SubType2 = object(SuperType);SubType1.name = "Troy";SubType1.number.pop();SubType2.name = "Alice";SubType2.number.pop();console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

ECMAScript 5 版(直接用Object.create(),再繼承)

var SuperType = {  name: "Oliver",  number: [321,321,4532,1]};var SubType1 = Object.create(SuperType); //省略了定義object()函數(shù)var SubType2 = Object.create(SuperType);SubType1.name = "Troy";SubType1.number.pop();SubType2.name = "Alice";SubType2.number.pop();console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

ECMAScript 5 簡寫版(定義Object.create()的第二個參數(shù),再繼承)

var SuperType = {  name: "Oliver",  number: [321,321,4532,1]};var SubType1 = Object.create(SuperType,{  name: {    value : "Troy"  }});var SubType2 = Object.create(SuperType,{  name: {    value : "Alice"  }});SubType1.number.pop();SubType2.number.pop();console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

寄生式繼承(用于共享引用類型的值,與原型式類似)

function createAnother(original){  var clone = Object(original);  clone.sayHi = function(){    return "Hi";  };  return clone;}var person = {  name: "Oliver",  number: [13,21,31,1]};var anotherPerson = createAnother(person);anotherPerson.number.pop();console.log(anotherPerson.sayHi() + anotherPerson.number); //Hi13,21,31console.log(person.number); //13,21,31

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芦溪县| 双辽市| 隆回县| 永和县| 利辛县| 宣武区| 鹰潭市| 荔波县| 龙山县| 绥滨县| 确山县| 儋州市| 丹江口市| 通州市| 庆安县| 山阴县| 娄烦县| 浙江省| 南岸区| 民县| 阜新市| 班玛县| 伊吾县| 博野县| 南木林县| 大渡口区| 抚州市| 伽师县| 容城县| 盘山县| 平遥县| 吐鲁番市| 唐海县| 兴和县| 樟树市| 彰化市| 长海县| 安龙县| 象山县| 江孜县| 巴彦淖尔市|