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

//<七>、拷贝继承

相关推荐
我命由我123451 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
Hopebearer_2 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
抱抱宝2 小时前
Agent-study项目教程(03):手写 Mini-ReAct Agent(不依赖框架)
javascript·人工智能·gpt·react.js·prompt·agent
东风破_2 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
用户938515635073 小时前
Next.js 笔记系统(二):Redis 数据服务与侧边栏组件拆分实战
javascript·全栈
圣殿骑士-Khtangc4 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
BigTopOne5 小时前
【ijkplayer】 硬解码流程
前端
kyriewen5 小时前
DeepSeek Harness开源第一天我就上手了——和Claude Code的差距比想象中大
前端·ai编程·deepseek
捡田螺的小男孩5 小时前
什么是 Skill?手把手带你写一个简单有用的 Skill!
前端·后端·程序员
IT_陈寒5 小时前
Redis集群这个坑,差点让我通宵
前端·人工智能·后端