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高级程序设计 - 第六章 面向对象的程序设计的更多相关文章

  1. JavaScript高级程序设计-第六章面向对象的程序设计

    创建对象主要的两种形式,创建Object实例和创建对象字面量 对象包含属性和方法 数据 .属性有四个特性,特性是为了描述属性行为的,他们是: Configurable(可配置的)是否能删除或是否能修改 ...

  2. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

  3. R in action读书笔记(3)-第六章:基本图形

    第六章  基本图形 6.1条形图 条形图通过垂直的或水平的条形展示了类别型变量的分布(频数).函数:barplot(height) 6.1.1简单的条形图 6.1.2推砌条形图和分组条形图 如果hei ...

  4. 读书笔记 - js高级程序设计 - 第五章 引用类型

      引用类型 和 类 不是一个概念 用typeof来检测属性是否存在 typeof args.name == "string"  需要实验 访问属性的方法 .号和[] 一般情况下要 ...

  5. 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

      Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...

  6. 读书笔记 - js高级程序设计 - 第十一章 DOM扩展

      对DOM的两个主要的扩展 Selectors API HTML5  Element Traversal 元素遍历规范 querySelector var body = document.query ...

  7. 读书笔记 - js高级程序设计 - 第七章 函数表达式

      闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...

  8. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

      5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...

  9. 读书笔记 - js高级程序设计 - 第三章 基本概念

    启用严格模式 "use strict" 这是一个 pragma 编译指示 让编码意图更清晰  是一个重要原则 5种简单数据类型 Undefined Null Boolean Num ...

随机推荐

  1. Linux-lsxxx

    Linux-lsxxx ls list directory contents 列出文件及目录 lsattr List file attributes on a Linux second extende ...

  2. ubuntu16下安装mongodb 3.6

    1.安装MongoDB社区版     # 1. 导入MongoDB public GPG Key sudo apt-key adv --keyserver hkp://keyserver.ubuntu ...

  3. tp3.2 自带的文件上传及生成缩略图功能

    public function upload_file($file_name,$width,$height) { //检查图片尺寸是否合法 $image_size = getimagesize($_F ...

  4. 安卓Recycleview简单的网格布局-初学者的关键点

    导包 def supportVersion = '28.0.0' 定义常量我的sdk版本为28 implementation "com.android.support:recyclervie ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cog

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. mybaits-plus总结

    import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; ...

  7. Mysql 模糊查询 转义字符

    MySQL的转义字符“\” \0   一个ASCII  0  (NUL)字符.    \n    一个新行符.    \t    一个定位符.    \r    一个回车符.    \b    一个退 ...

  8. python基础(变量,字符串,列表,元组)

    #列表的操作list1 = ['wuqiang','lichang','changhao'] #列表的定义print(list1) #操作列表print(list1[-1]) #操作列表的最后一位li ...

  9. pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案

    1 问题描述 使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度.帧高度.视频变速.降低视频码率达到限制视频大小),使用了ffmpeg. ffmpeg- ...

  10. Compare/ContrastEssay你真的会写了吗?

    Compare/Contrast Essay也是留学生们常遇到的一种作业类型,但是很多留学生不知道怎么写.本文HotEssay为大家整理了Compare/Contrast Essay写作方法,希望对大 ...