读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计
|
EcmaScript有两种属性
|
数据属性 和 访问器属性
|
|
数据属性有4个特性
|
Configurable
Enumerable
Writable
Value
前三个值的默认值都为false
举例
Object.defineProperty( person, "name", { writable:false, value:"niko"} ) ;
一旦属性定义为不可配置的,就不能再把它变回可配置的了
|
|
读取属性 的特性
|
var descriptor = Object.getOwnPropertyDescriptor( book, "_year" )
descriptor.value
descriptor.configurable
|
|
使用构造函数模式创建对象
|
function Person( name,age,job ){
this.name = name ;
this.age = age ;
this.sayName = function(){
alert( this.name )
}
}
|
|
用原型模式创建对象
|
function Person(){}
Person.prototype.name = "jeff";
Person.prototype.age = 28
好处是 可以让所有对象实例共享它所包含的属性和方法,
Person.prototype指向了原型对象 而Person.prototpe.constuctor 又指向了Person
|
|
判断类型
|
Person.prototype.isPrototypeOf( person1 ) // true
Object.getPrototypeOf( person1 ) == Person.prototype ) ; //true
|
|
判断一个属性是在原型中,而不是在实例中
|
function hasPrototypeProperty( object, name ){
return !object.hasOwnProperty( name ) && ( name is object ) ;
|
|
取得对象上所有可枚举的实例属性
|
Object.keys() 方法
|
|
如果你想要得到所有实例属性,无论它是否可枚举,都可以用方法
|
Object.getOwnPropertyNames() d
var keys = Object.getOwnPropertyNames( Person.prototype );
//"constructor name age job sayName
|
|
使用constructor不能确定对象的类型
|
var friend = new Person()
friend instanceof Object //true
friend instanceof Person //true
friend.constructor == Person // false
friend.constructor == Object // true
|
|
实例 和 原型 之间通过什么链接
|
只是一个指针 而非副本
|
|
在原生对象的原型上添加方法
|
String.prototype.startWith = function(text) { return this.indexOf(text) == 0 }
var msg = "hello world"
msg.startWith("hello");
|
|
原型对象的缺点
|
最大问题是 由其共享的本性所导致的
function Person(){}
Person.prototype = { constructor:Person, name:"nico",friends:["a","b"]}
var p0 = new Person();
var p1 = new Person();
p0.friends.push("c");
那么p1的friends里也会有c
|
|
组合使用构造函数模式 和 原型模式
|
构造函数模式用于定义 实例属性 ,而原型模式用于定义方法和共享的属性
function Person( name, age, job ){
this.name = name;
this.age = age ;
this.job = job ;
}
Person protytype = {
constructor:Person,
sayName: function(){
alert( this.name ) ;
}
}
|
|
动态原型模式
|
function Person( name, age, job ){
this.name = name
this.age = age ;
this.job = job ;
if( typeof this.sayName != "function" ){
Person.prototype.sayName = function(){} ;
}
}
|
|
寄生构造函数模式
|
待补
|
|
稳妥构造函数模式
|
待补
|
|
继承
|
待补
|
读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计的更多相关文章
- JavaScript高级程序设计-第六章面向对象的程序设计
创建对象主要的两种形式,创建Object实例和创建对象字面量 对象包含属性和方法 数据 .属性有四个特性,特性是为了描述属性行为的,他们是: Configurable(可配置的)是否能删除或是否能修改 ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- R in action读书笔记(3)-第六章:基本图形
第六章 基本图形 6.1条形图 条形图通过垂直的或水平的条形展示了类别型变量的分布(频数).函数:barplot(height) 6.1.1简单的条形图 6.1.2推砌条形图和分组条形图 如果hei ...
- 读书笔记 - js高级程序设计 - 第五章 引用类型
引用类型 和 类 不是一个概念 用typeof来检测属性是否存在 typeof args.name == "string" 需要实验 访问属性的方法 .号和[] 一般情况下要 ...
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...
- 读书笔记 - js高级程序设计 - 第十一章 DOM扩展
对DOM的两个主要的扩展 Selectors API HTML5 Element Traversal 元素遍历规范 querySelector var body = document.query ...
- 读书笔记 - js高级程序设计 - 第七章 函数表达式
闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...
- 读书笔记 - js高级程序设计 - 第三章 基本概念
启用严格模式 "use strict" 这是一个 pragma 编译指示 让编码意图更清晰 是一个重要原则 5种简单数据类型 Undefined Null Boolean Num ...
随机推荐
- win7 & win10 安装AD管理工具
总所周知,AD域的作用对于一个公司有着无比重要的作用,但是在Win7/10系统下该如何去管理AD域呢. 对于AD域的服务器搭建,在这里我们不进行说明,感兴趣的同学可以去Google相关的资料,现在主要 ...
- DB2的常用指令
注:大写的是固定的,小写的根据自己的实际情况 首先进入 命令窗口, win+r ---> 输入 db2cmd db2 1. 删除数据库 UNCATALOG DB db_name --db_nam ...
- JS: 复选框——ALL与A、B、C(选中ALL同时选中各子项)
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title> ...
- python用于web题里写解密脚本
题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...
- Java中的数学方法
直接用代码 public class TestNumber { public static void main(String[] args) { float f1 = 5.4f; float f2 = ...
- Live555研究之一 源代码编译
Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化 ...
- 编写程序,实现在带头结点的单链表L中删除一个最小值节点的算法。
算法复杂度0(n) #!/usr/bin/env python3 class LNode(object): def __init__(self, elem, next_=None): self.ele ...
- 【Cantor表】蒟蒻题解
原题:传送门 (上图摘自网站OpenJudge - NOI题库2.1 Cantor表) 本蒟蒻的题解,让大神们见笑了! 首先,进行找规律. 大家可以发现: 1.当分子是一的时候,且分子和分母的和是偶数 ...
- Python 自动登录哔哩哔哩(2captcha打码平台)
前言 研究爬虫的各位小伙伴都知道,需要登录才能获取信息的网站,是比较难爬的,原因就是在于,现在各大网站为了反爬,都加入了图片验证码,滑动验证码之类的干扰 本篇就针对哔哩哔哩的滑动验证码进行讲解和破解 ...
- Python 中 unittest 框架加载测试用例的常用方法
unittest 当中为我们提供了许多加载用例的方法,这里说下常用的两种方法...推荐使用第二种 第一种加载测试用例的方法:使用加载器加载两个模块 需要把所有的模块加载到套件中 那么就可以自动的运行所 ...