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 {}

//<七>、拷贝继承

相关推荐
陈天伟教授13 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
信看14 小时前
NMEA-GNSS-RTK 定位html小工具
前端·javascript·html
Tony Bai14 小时前
【API 设计之道】04 字段掩码模式:让前端决定后端返回什么
前端
爱吃大芒果14 小时前
Flutter 主题与深色模式:全局样式统一与动态切换
开发语言·javascript·flutter·ecmascript·gitcode
苏打水com14 小时前
第十四篇:Day40-42 前端架构设计入门——从“功能实现”到“架构思维”(对标职场“大型项目架构”需求)
前端·架构
king王一帅14 小时前
流式渲染 Incremark、ant-design-x markdown、streammarkdown-vue 全流程方案对比
前端·javascript·人工智能
苏打水com14 小时前
第十八篇:Day52-54 前端跨端开发进阶——从“多端适配”到“跨端统一”(对标职场“全栈化”需求)
前端
Bigger14 小时前
后端拒写接口?前端硬核自救:纯前端实现静态资源下载全链路解析
前端·浏览器·vite
BD_Marathon15 小时前
【JavaWeb】路径问题_前端绝对路径问题
前端