- 浏览: 1312467 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (732)
- Java_about (146)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (22)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
javascript的类继承小结
继承这个东西,本来是面向对象的特性。javascript本来也不是为面向对象设计的,起码初衷不是,否则也不会没有用class这个关键字(ECMAScript保留了这个关键字)。
作为面向对象的“弥补”,跟perl一个样子,留下一个继承的“基因”,或者叫“继承通道”更合适,名为prototype,在本scope中没有找到某个方法时,会去prototype中查找,以此一直往上一层找下去,直到找到或者到达顶层类。看出来了,javascript的这种寻找方式是“单继承的”。perl中的这个“继承通道”名为@ISA,@符号表明这是个数组,可以支持多继承。
原型链_单继承
原理:
javascript中这个“继承通道”的官方说法叫“原型链”(prototype chain),即在子类找不到某属性时,会去原型链中寻找。
注意:
#1 原型链是单继承的
#2 父类构造函数可以有参数,但是子类调用时传递给父类的参数没有用,所以标准做法是不传递参数(传也可以但不起作用,反而容易让人误解)
#3 子类在给prototype赋值前不要定义属性,否则会被抛弃(其实是指针重定向)
#4 子类给prototype赋值为一个对象,而不是一个类(与perl等不同)
不足之处:
仅仅可以继承prototype中的属性(方法是对象,也是属性),而this属性并不能继承。
function ClassA() { this.age = 100; function sayAge(){ alert("age:" + this.age); } } ClassA.prototype.color = "red"; ClassA.prototype.name = "fantaxy_a"; ClassA.prototype.sayColor = function () { alert("color:" + this.color); }; ClassA.prototype.sayName = function(){ alert("name:" + this.name) } function ClassB() { this.name = "fantaxy_b" } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function(){ alert("My name is:" + this.name) } //run b = new ClassB() b.sayColor() // =>red b.sayName() // =>My name is:fantaxy_b //b.sayAge();//Wrong!!! no this method
对象冒充_多继承
原理:
I: 因为父类的类定义即构造函数是个函数,函数是对象,所以可以成为子类的方法被调用
II:又因为父类的属性是通过this关键字设置的,所以子类调用这个函数时,this在子类中执行同样的代码,为子类设置了同样的属性,达到冒充的目标
注意:
#1 冒充可以多继承(多冒充几个父类)
#2 冒充的是父类的this属性(而不是prototype属性)
#3 冒充时,子类属性需要在调用冒充的代码之后写。否则会因为“同名覆盖原则”导致子类属性被父类属性覆盖(正常应该是子类属性覆盖父类属性
#4 冒充多继承时,如果父类有同名方法,由“同名覆盖原则”,后“冒充”的父类方法会被找到执行
不足之处:
仅仅可以继承this属性,而原型链中的属性并不能继承。
function ClassA(sColor, sName) { this.color = sColor; this.name = sName; this.sayColor = function () { alert(this.color); }; this.sayName = function(){ alert(this.name) } } function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor, sName); delete this.newMethod; //We can define attribute local this.name = "name is:" + sName; this.sayName = function(){ alert("My " + this.name) } } //run b = new ClassB("red", "fantaxy_b"); b.sayColor();// =>red b.sayName();// =>My name is fantaxy_b
对象冒充的同名方法 call() 和 apply()
对象冒充的本质原理为:执行父类的构造方法,利用this原理,设置子类同样的属性。
所以,只要是能在子类中执行父类构造方法的,都可以达到这个效果。
call语法:
aMethod.call(objX, paramA, paramB)
等价于在objX这个对象上执行aMethod方法,即:objX.aMethod(paramA, paramB)
如果aMethod为父类构造函数,则达到冒充效果
apply语法: 与call语法类似,区别在于apply的参数要写进一个Array中,把这个Array作为参数
aMethod.call(objX, [paramA, paramB])
等价于在objX这个对象上执行aMethod方法,即:objX.aMethod([paramA, paramB])
如果aMethod为父类构造函数,则达到冒充效果
function sayColor(sPrefix, sSuffix) { alert(sPrefix + this.color + sSuffix); } var obj = new Object(); obj.color = "red"; //outputs "The color is red, a very nice color indeed. " sayColor.call(obj, "The color is ", ", a very nice color indeed. "); //call sayColor.apply(obj, ["The color is ", ", a very nice color indeed. "]);//apply
如果aMethod为父类构造函数,则达到冒充效果
function ClassB(sColor, sName) { //this.newMethod = ClassA; //this.newMethod(sColor, sName); //delete this.newMethod; ClassA.call(this, sColor); //call ClassA.call(this, [sColor]);//apply //We can define attribute local this.name = "name is:" + sName; this.sayName = function(){ alert("My " + this.name) } }
原型链和对象冒充混合方式
原型链和对象冒充正好是互补的,混合使用,可以达到不错的效果~
function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) { ClassA.call(this, sColor); this.name = sName; } ClassB.prototype = new ClassA(null);//这里可以传参数,也可以不传,总之这参数不起作用 ClassB.prototype.sayName = function () { alert(this.name); }; //run b = new ClassB("red", "fantaxy_b"); b.sayColor(); b.sayName();
P
P
P
O
P
P
P
发表评论
-
浏览器辅助神器:油猴脚本使用教程
2023-08-06 16:54 347= 最近一个功能,使用其他脚本总是运行出问题。 不得已使 ... -
js控制鼠标滚轮的方法_javascript控制鼠标滚轮的方法_jquery控制鼠标滚轮的方法
2022-06-10 17:20 417= js没有模拟click这样的scroll函数。仅仅通 ... -
jquery判断元素是否隐藏是否可见的多种方法
2022-04-05 19:24 501= = = jquery判断元素是否隐藏的多种方法 ... -
js JavaScript 读取文件数据、导出文本到文件。console输出到本地文件
2021-03-11 19:41 1511= 需求:输出点内容到本地文件。 方法:下面。 大概 ... -
万能代码,一招破解网页禁止复制
2020-10-19 20:11 740= 使用评测: 发现使用之后,页面的正常的js不好用了 ... -
jQuery 选择同时包含两个class的元素的实现方法
2020-10-18 23:03 491= = = from:https://www.cnb ... -
5个JS模板引擎
2020-06-28 11:38 370= 实际来看: 1百度的好用,但比较老。 1腾讯的用 ... -
获取weixin文章列表的js
2019-05-09 18:55 467= 没来得及优化,将就用着。 暂存备用。 = // ... -
如何在console控制台导入jquery
2019-04-23 21:05 1114= = = /* 百度共用jquery包 htt ... -
Jquey_Selenium对不显示节点的处理不同_比如getText结果不同
2018-08-25 10:38 632= = = Jquery中,不显示节点(displa ... -
[知乎问题]如何衡量一个人的angularjs水平?
2017-07-20 15:22 874= = = [知乎问题]如何衡量一个人的angular ... -
HTTP头的Expires与Cache-control区别
2016-12-23 18:53 1114HTTP头的Expires与Cache-control区别 ... -
200 OK (from cache) 与 304 Not Modified
2016-12-13 18:12 997200 OK (from cache) 与 304 N ... -
gulp_如何保证任务和程序顺序执行?
2016-05-11 20:17 2013使用return来解决,是最好的方式。 return有很 ... -
nodejs之supervisor__supervisor的python版本
2016-05-07 10:07 1708【nodejs之supervisor】 如 ... -
nodejs_cnpm导致node的prefix和cache和node_global配置环境变量不起作用
2016-05-06 11:41 4817cnpm的介绍: http://npm.taoba ... -
Foundation和zepto
2016-04-29 15:07 826为什么我们放弃了 Z ... -
npm link 命令解析
2016-04-29 13:44 1540npm link 命令解析 fr ... -
nodejs npm常用命令
2016-04-28 15:05 677nodejs npm常用命令 np ... -
nodejs中的环境变量:NODE_PATH
2016-04-28 15:05 1760注:没有解决gulp本地文件依赖的问题。 == ...
相关推荐
本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...
这篇博客“JavaScript 面向对象编程小结”可能涵盖了JavaScript中实现OOP的一些核心概念和技巧。 首先,面向对象编程的基础是类与对象。在JavaScript中,虽然没有像Java或C++那样的传统类机制,但是可以通过构造...
继承使得类可以从其他类(或多个类)继承属性和方法,从而实现代码复用。多态则意味着编写出的函数或方法可以处理多种不同类型的对象,增加了程序的灵活性。 在JavaScript中,Array对象是最常用的内置对象之一,它...
这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...
JavaScript是一种基于原型的面向对象语言,其类和对象的定义方式与传统面向对象的语言(如Java或C++)有所不同。 JavaScript中定义类或函数,主要有以下几种方式: 1. 工厂方式 工厂方式是JavaScript中创建对象的...
小结 第3章 字面量和构造函数 对象字面量 自定义构造函数 强制使用new的模式 数组字面量 JSON 正则表达式字面量 基本值类型包装器 错误对象 小结 第4章 函数 背景 回调模式 返回函数 ...
本文主要讨论了JavaScript中的类继承方法,特别是关注于组合继承的实现策略。以下是对这些继承方式的详细分析: 1. **借用构造函数(Constructor Borrowing)** 借用构造函数是一种解决子类无法向超类传递参数以及...
本小结通过对var、let、const的区别的分析,以及对基本包装类型、对象新方法和字符串操作方法的介绍,展示了ES6在JavaScript编程中的重要地位和对开发实践的深刻影响。对于前端开发者而言,掌握这些新特性将有助于...
for...in循环用于遍历对象的所有可枚举属性,包括从原型链继承的属性。对于数组,它会遍历索引。例如: ```javascript for (var i in myArray) { console.log(i + ' - ' + myArray[i]); } ``` 这种方法不推荐...
JavaScript的继承机制是其面向对象编程的核心特性,它允许创建基于现有对象的新对象,从而实现代码的重用和扩展。JavaScript的继承主要有以下几种实现方式: 1. **原型链继承**(Prototype Inheritance): - 原型...
#### 四、小结 通过上述示例和讲解,我们可以看到JavaScript中的类继承可以通过多种方式实现,每种方式都有其优缺点。开发者可以根据实际需求选择最适合的方式进行继承。随着ES6的普及,现代JavaScript还提供了更...
JavaScript继承模式是该语言面向对象编程核心特性之一,它允许开发者以不同的方式从父对象或构造函数中继承属性和方法。接下来,将详细介绍JavaScript中几种常见的继承模式,并结合具体代码实例分析其实现技巧与注意...
前言 第1章 简介 模式 JavaScript:基本概念 ECMAScript JSLint Co ole 第2章 基本技巧 编写可维护的代码 尽量少用全局变量 ...小结 ...小结 ...小结 ...小结 ...传统与现代继承模式的比较 使用类式继承时的预期结果 ...小结
### JavaScript 的继承方法小结(Prototype、Call、Apply) #### 一、JavaScript 原型继承 -- Prototype 在 JavaScript 中,“一切皆对象”。通过 `new` 关键字创建的对象是函数对象,而直接赋值的对象则是一般...