你不知道的JavasScript上篇·第四章·混合对象·类
一、类的理论
1、类的核心概念:多态
- 是说父类的通用行为可以被子类用更特殊的行为重写
二、类的机制
1、构造函数
类实例是有一个特殊的类方法构造的,这个方法名通常和类名一致;
类构造函数属于类,构造函数大多需要用new来调。
2、类的多态
其实就是子类可以改写父类的同名方法也可以调用继承自父类的同名方法,
任何方法都可以引用继承层次中高层的方法,无论高层的方法名是否相同。
多态的另一个方面是,在继承链的不同层次中一个方法名可以多次被定义,调用方法时会自动选择合适的定义。
多态并不表示子类和父类有关联,子类得到的只是父类的一份副本。
类的继承其实就是复制。
3、混入
模拟类的复制行为,这个方法就是混入。
混入分为两种类型:显示和隐式
- 显示混入:手动进行复制的。
下面例子中 Person.eat.call(this) 就是显式多态
function mixin(sourceObj,targetObj){
for(key in sourceObj){
console.log(!(key in targetObj))
//当Person里有,targetObj里没有的时候才进行复制
if(!(key in targetObj)){
targetObj[key] = sourceObj[key]
}
}
return targetObj;
}
var Person = {
sex:'person',
drink:function(){
console.log('person要喝水')
},
eat:function(){
console.log('person要吃东西')
}
}
var girl = mixin(Person,{
sex:'girl',
eat:function(){
Person.eat.call(this);
console.log(this.sex+'要吃东西')
}
})
console.log(girl)
girl.eat();
运行结果如图:

复习上篇内容:
"属性名" in 目标对象:在目标对象上查找属性名也在原型链上也查找
Object.prototype.hasOwnPrototype.call(目标对象,属性名) 只在目标对象上查找属性
这里的
if(!(key in targetObj)){
targetObj[key] = sourceObj[key]
}
也可以写成
if(!(Objcet.prototype.hasOwnProperty.call(targetObj,key)){
targetObj[key] = sourceObj[key]
}
但是因为这里targetObj和souceObj并没有继承关系所以不必用Object.prototype.hasOwnProperty.call()
- 寄生继承
寄生继承是显式混入模式的一种变体,因为他既是显式的又是隐式的
实例:
function Animal(){
this.type = 'animal'
}
Animal.prototype.color = function(){
console.log("animal's color")
}
Animal.prototype.weight = function(){
this.color();
console.log("animal's weight")
}
function Cat(){
var cat = new Animal();
cat.type='cat';
var anweight = cat.color;
cat.weight = function(){
anweight.call(this);
console.log(this.type+"color" )
}
return cat;
}
var myCat = new Cat();
myCat.weight()
- 隐式混入
function Something = {
cool:function(){
this.greeting = 'hello world';
this.count = this.count ? this.count+1 : 1 ;
}
}
Something.cool();
Something.greeting();
Something.count;
var Another = {
cool:function(){
//隐式把Something混入Another
Something.cool.call(this)
}
}
Another.cool();
Another.greeting;//hello world
Another.count;//1
这样的结构容易搞不清this,对于方法的引用容易出现问题,一般不从采用这种结构
总结:
类是一种设计模式,也意味着复制。
类被继承时,行为(属性)也会被复制到子类中
多态(在继承链的不同层次名称相同但是功能不同的函数) 看起来似乎是从子类引用父类,但是本质上引用的其实是复制的结果
混入模式可以用来模拟类的复制行为,显式混入实际上无法完全模拟类的复制行为,因为在Js中对象只能复制引用,无法复制被引用的对象或者函数本身(函数也是对象)
你不知道的JavasScript上篇·第四章·混合对象·类的更多相关文章
- 你不知道的JavasScript上篇·第三章·对象
1.Object.defineProperty()&&getter.setter Object.defineProperty(目标对象,属性名(string型),{ get:funct ...
- 你不知道的JavasScript上篇·第五章·原型·下
5.差异继承 继承意味着复制操作: 差异继承: 基本原则是在描述对象行为时,使用其不同于普遍描述的特制. (我的理解是只用对象自身的而不用普遍继承的像是toString(),valueOf()这种方法 ...
- 你不知道的JavasScript上篇·第五章·原型·上
1.[[Prototype]] JS中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时这个属性都被赋予一个非空的值 (proto) var my ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- JQuery制作网页—— 第四章JavaScript对象及初识面向对象
1.对象:在JavaScript中,所有事物都是对象,如字符串.数值.数组.函数等. JavaScript中的基本数据类型: number(数值类型) string(字符串类型) boolean ...
- Java 学习笔记 ------第四章 认识对象
本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...
- #《Essential C++》读书笔记# 第四章 基于对象的编程风格
基础知识 Class的定义由两部分组成:class的声明,以及紧接在声明之后的主体.主体部分由一对大括号括住,并以分号结尾.主体内的两个关键字public和private,用来标示每个块的" ...
- 《Python核心编程》 第四章 Python对象- 课后习题
练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到. 类型:对象的 ...
- 【2】python核心编程 第四章-python对象
1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...
随机推荐
- DES/3DES/AES区别
公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用. DES 1977年1月,美国 ...
- 微信赌场——H5棋牌游戏渗透之旅
i春秋作家:F0rmat 0x01 前言 本来不想发的,涉及太多利益了,这些棋牌游戏的源码最高能卖到几万.开发起来不比一个商场程序难.最近又太忙了,没时间去做代码审计的文章了,但一不小心又抢了个运气王 ...
- cas未能够识别出目标 ***;票根
使用cas做单点登录,在验证ticket的时候,报下面的错误: <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> & ...
- [Swift]lower_bound和upper_bound
时间复杂度:一次查询O(log n),n为数组长度. [C++] lower_bound:返回大于等于val的第一个值 功能:查找非递减序列[first,last) 内第一个大于或等于某个元素的位置. ...
- html和css入门
html 单机软件:软件程序和数据都存储在客户端 界面:Tk.PyQt.wxPython库C/S(Client/Server)架构软件:软件程序和数据一部分存在客户端,一部分存在服务器端 界面:Tk. ...
- mybatis四大接口之 StatementHandler
1. 继承结构 StatementHandler:顶层接口 BaseStatementHandler : 实现顶层接口的抽象类,实现了部分接口,并定义了一个抽象方法 SimpleStatementHa ...
- 优化openfire服务器提升xmpp 效率的15个方法(原创)
1.禁用原生xmpp搜索,使组织架构.人员数据本地化保存,并使客户端数据同步服务器,降低原生xmpp搜索的iq消耗,因为搜索是im应用的频繁操作: 2.禁用roster花名册.禁用presence包通 ...
- 关于使用 IDEA Spring Boot 热部署
1,POM 中引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- odoo开发笔记 -- odoo和postgresql数据库导入相关
odoo数据库 导入.导出 首先odoo框架下postgresql数据库中,表结构的存储方式: 存在id(小写),并没有所谓的外部ID 例如数据库中的国家表:模块名_tb_country (注意: ...
- Git for Windows之基础环境搭建与基础操作
一.安装Git工具 下载地址:Git For Windows 下载完后,安装,全程Next. 二.全局配置 1.配置本地用户名,用于提交代码 2.配置邮箱 三.创建本地Git项目仓库 1.建立代码仓库 ...