闲聊javascript继承和原型

javascript继承已经是被说烂的话题了,我就随便聊一点~

一、javascript的复制继承

javascript的继承有复制继承和原型继承,基于复制继承用的不太多,而且无法通过instanceof的验证

//拷贝继承,prototype.js的extend=>
function extend(destination,source){
    for(var property in source)
    destination[property]=source[properyt];
    return destination;
}

二、javascript原型继承

js原型继承是基于原型链查找的,js每个函数都有prototype属性和__proto__属性,每个实例的__proto__属性都指向函数的prototype(es6里面实例的__proto__都指向这个函数),下面这个例子证明了这个观点。

function A(){
    console.log(this.__proto__.aa);//1
    this.aa=2
}
A.prototype={
    aa:1
}
var a=new A;
console.log(a.aa);//2
a.__proto__={
    aa:3
}
delete a.aa;//删除特权属性
console.log(a.aa);//3

实例在查找方法的时候按原型链查找,先找自身的属性,没有就到构造函数的prototype里找,没有再到构造函数的构造函数的prototype里找,只到Function的prototype。那我们让a的prototype等于A的实例,不就完成了继承了么。

function A(){}
A.prototype={
    aa:1
}
function bridge(){};
bridge.prototype=A.prototype;
function B(){}
B.prototype=new bridge();
B.prototype.constructor=B;

这里继承是用了一个bridge函数做了桥,因为当A有很多内容的时候,实例化A消耗比较多,而且并没有什么用,就用一个空函数做桥接一下。这里最后再改一下实例的构造函数指向自己,这就完成了继承。

var b=new B;
B.prototype.cc=function(){
    alert(3)
}
console.log(b.__proto__==B.prototype);//true
console.log(b.__proto__.__proto__===A.prototype);//true

这里b的__proto__是指向构造函数的prototype的。

时间: 2024-12-23 13:40:33

闲聊javascript继承和原型的相关文章

javascript继承,原型继承,借用构造函数继承,混合继承

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

理解JavaScript:继承与原型链

本文翻译自https://wildlyinaccurate.com/understanding-javascript-inheritance-and-the-prototype-chain Javascript里的一切几乎都是对象,每一个对象都有一个链接到其他对象的内部属性,我们称之为prototype (原型).原型对象自己也有自己的原型对象,以此类推,这时候原型链就出来了.如果你追踪原型链,你最终会到达原型为 null的内核 Object,这是原型链的终点. 原型链的作用是什么呢?当我们访问

JavaScript继承与原型链

对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了class 关键字,但只是语法糖,JavaScript 仍旧是基于原型). 涉及到继承这一块,Javascript 只有一种结构,那就是:对象.在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接.这个原型对象又有自己的原型,直到某个对象的原型为 null 为

javascript继承笔记----1024

惊涛随笔 javascript继承笔记 //原型(prototype):原型是一个对象,其他对象可以通过它实现属性继承 /*笔记:* 1.类式继承:通过原型链继承的方式 * 2.原型式继承:对类式继承的封装 * 3.寄生式继承:对原型继承的二次封装,并且在第二次封装过程中对继承的对象进行扩展 * 4.构造函数式继承:通过构造函数继承的方式 * 5.组合式继承(类式继承+构造函数式继承 两者优点相加过滤缺点) * 6.寄生组合式继承:寄生式继承融合构造函数式继承的优点去除缺点的方式*/ //原型式

JavaScript继承总结

1.创建对象 1.字面量对象 2.构造函数 3.Object.create //1.字面量 var obj={ name: '字面量', show: function(){ console.log(this.name) } } //2.构造函数 function fun (name) { this.name=name } var obj=new fun('obj') //3.Object.create var obj={name: 'obj'} var obj=Object.create(obj

JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype = new 父类型();”,实现方法如下

JavaScript中的继承(原型链)

一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.property = true; } SupType.prototype.getSupvalue = function() { return this.property; }; function SubType() { this.subproperty = false; } //原型对象等于一个类型的实例

JavaScript中的原型和继承

请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans 原型车.这些车虽然是由"奥迪"或"标致"这些厂商制造的,可它们并不是你在街上或速公路上所见到的那类汽车.它们是专为参加高速耐力赛事而制造出来的. 厂家投入巨额资金,用于研发.设计.制造这些原型车,而工程师们总是努力尝试将这项工程做到极致.他们在合金.生物燃料.制动技术

详解JavaScript中的原型和继承-转自颜海镜大大

本文将会介绍面向对象,继承,原型等相关知识,涉及的知识点如下: 面向对象与继承 CEOC OLOO 臃肿的对象 原型与原型链 修改原型的方式 面向对象与继承 最近学习了下python,还写了篇博文<重拾编程乐趣——我的Python笔记>,加深了我对面向对象的一些理解. 我们会对我们写的程序进行抽象,而不同的语言都提供了不同的抽象工具,比如各种语言里面的数组,集合(键值数组,哈希表,字典等)等提供了对数据的抽象:而VB里面的子程序,类C语言里面的函数,提供了抽象代码段的能力. 有时我们希望将数据