JS 原型与继承2

//***-、原型、原型链、构造函数 prototype、 proto_、constructor

function Foo(){this.a=1} var foo = new Foo();

Object.getPrototypeOf(foo);//访问对象原型 效果等同于,foo. proto ,只是更推荐使用 Es6的 Object.getPrototypeof()方式

// constructor是原型上的一个属性,指向的是构造函数,如果重写了原型,就需要给他定义一个 constructor让它指向构造函数,否则实例的 constructor就会指向object// 重写构造函数原型,需要手动设置 constructor 为当前构造函数 Foo.prototype = {

aa:1,

bb:function(){

console.log(20);

constructor:Foo //很有必要

//***二、继承

//<->、原型链继承 function Super() {

this.a = 11l;

this.b = [1,2,3,4];

Super.prototype.say = function () {

console.log(222);

function Sub({}

Sub.prototype == new Super();//实现:原型链继承

var subl = new sub(); var sub2 = new sub();

//实现的继承结果: subl -- Sub.prototype -- new Super() -- Super.prototype -- Object.prototype

//该方式存在问题(引用值共享问题): subl.b.push(5);

console.log(subl.b);//[1,2,3,4,5]

console.log(sub2.b) ;// [1,2,3,4,5] sub2的也被修改了

//<二>、构造函数继承 function Super() {

this.a =11l;

this.b = [1,2,3,4];

Super.prototype.say= function (){

console.log(222);}

function Sub(){

Super.call(this);//实现:构造函数继承

var subl = new sub); var sub2 = new sub();

//解决引用值共享问题 subl.b.push(5);

console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b) ;// [1,2,3,4]

//该方法存在问题(没办法拿到原型上的方法say方法 )

//<三>、组合继承(伪经典继承)

//***伪经典的原因在于,Super()执行了2次 function Super() {

this.a = 111;

this.b = [1,2,3,4];

Super.prototype.say=function(() {

console.log(222);

function Sub(){

Super.call(this);//实现:构造函数继承

Sub.prototype == new Super();//实现:原型链继承

var subl = new Sub(); var sub2 = new sub();

/1 该方式,既能解决引用值共享问题,又能拿到Super.prototype上的其他方法

// 因为,创建实例前,先给Sub指定原型,这时候已经先 newSuper()执行了。此时sub原型上的this.b 就是 [1,2,3,4]

11 创建实例时,再去 new Sub()时,通过 Super.call(this),就会把前一步构造函数上所有this,b全部覆盖,此时虽然值相同,但是已经是两个不同的引用值了

subl.b.push(5);

console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b);//[1,2,3,4]

//***<四>、寄生组合继承(经典继承) function Super() {

this.a = 11l;

this.b = [1,2,3,4];

Super.prototype.say = function(){

console.log(222);

function Sub(){

Super.call(this);//实现:构造函数继承 ----> 要解决引用值共享功能,所以必须要这样做

//Sub.prototype == new Super();//实现:原型链继承// 要点:通过 object.creat(),绕开new Super()

Sub.prototype =0bject.creat(Super.prototype);//返回一个对象,指定当前赋值对象的原型为传入的参数 //实现:原型链继承

/ 注意:Object.creat(),是Ess的方法,ES3不支持,会有兼容性问题,需要些兼容性方案

***Object.creat 的兼容性方案 if(!Object.creat) {

Object.creat = function(proto) {

function F() {};

F.prototype = proto; return new f();

var subl = new sub(); var sub2 = new sub();

subl.b.push(5);

console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b) ;// [1,2,3,4]

// 寄生组合继承,依然存在的问题:

/ Sub.prototype-Object.creat(Super.prototype);此时重写了sub的原型,如果在这句执行之前,往sun原型中添加了其他原型方法,就会被覆盖导致不可用而报错

//***<五>、圣杯模式继承:

//***<六>、extends 关键字,直接实现继承(ES6解决方案): class Super() {}

class Sub() extends Super {}

//<七>、拷贝继承

相关推荐
m0_7482546622 分钟前
CSS AI 编程
前端·css·人工智能
不绝19126 分钟前
C#核心——面向对象:封装
开发语言·javascript·c#
27669582921 小时前
dy bd-ticket-guard-client-data bd-ticket-guard-ree-public-key 逆向
前端·javascript·python·abogus·bd-ticket·mstoken·ticket-guard
m0_726365831 小时前
哈希分分预测系统 + Python Worker + Web 仪表盘”小系统(PHP + MySQL)
前端·python·哈希算法
WX-bisheyuange1 小时前
基于SpringBoot的交通管理在线服务系统
前端·javascript·vue.js·毕业设计
WHOVENLY1 小时前
揭秘正则表达式的基础语法与应用
开发语言·javascript·正则表达式
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试系统DDD(领域驱动设计)实现步骤详解(2)
java·前端·数据库·人工智能·spring boot
GIS之路2 小时前
ArcGIS Pro 实现影像波段合成
前端·python·信息可视化
m0_748254662 小时前
CSS id 和 classid 和 class 选择器
前端·css
光算科技2 小时前
单页应用SEO可行性丨Angular项目的3个索引优化方案
前端·javascript·angular.js