你不知道的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()来得到. 这个值可以被认为是该对象的 ...
随机推荐
- Akka(42): Http:身份验证 - authentication, authorization and use of raw headers
当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以 ...
- Spring Boot中使用JdbcTemplate访问数据库
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...
- Spring Boot中使用Swagger2构建RESTful API文档
在开发rest api的时候,为了减少与其他团队平时开发期间的频繁沟通成本,传统做法我们会创建一份RESTful API文档来记录所有接口细节,然而这样的做法有以下几个问题: 1.由于接口众多,并且细 ...
- [Vue] vue-cli3.0安装
1. node.js安装https://nodejs.org/en/download/ 2.npm的安装 由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了.同样可以通过输入 &qu ...
- 简单记录常用git 命令
声明:仅作笔记用 拉取远程代码 1.git pull 2.如果需要,输入账户名密码 将本地代码推送到远程 1.git push 2.如果需要,输入账户名密码 同步远程分支 1.git fetch 2. ...
- ProxySQL 部署 Single Writer Failover 读写分离 (PXC)
主机信息: Proxysql: 如果你忽略了ProxySQL会报告主机组的变化,我建议把它设置为0,除非你试图调试"某些东西",否则你的日志将很快变得巨大.UPDATE globa ...
- 坑爹的Sun JDK
Sun的这个java.lang.Throwable 源码 设计非常糟糕,完全没有扩展性, 我在IBM 的Java JDK下,继承java.lang.Throwable重新定义了一个ExceptionW ...
- 继承extends、super、this、方法重写overiding、final、代码块_DAY08
1:Math类的随机数(掌握) 类名调用静态方法. 包:java.lang 类:Math 方法:public static double random(): Java.lang包下的类是不用导包就可 ...
- Java代码操作HDFS测试类
1.Java代码操作HDFS需要用到Jar包和Java类 Jar包: hadoop-common-2.6.0.jar和hadoop-hdfs-2.6.0.jar Java类: java.net.URL ...
- 监督学习——AdaBoost元算法提高分类性能
基于数据的多重抽样的分类器 可以将不通的分类器组合起来,这种组合结果被称为集成方法(ensemble method)或者元算法(meta-algorithom) bagging : 基于数据随机抽样的 ...