js:语言精髓笔记8--对象系统
2014-11-08 16:35
204 查看
封装:
一把对象系统,封装是由语法解析来实现的,即语法作用域;但js是动态语言,因此只能依赖变量作用域;
[b]js的变量作用域只有表达式,函数,全局三种;所以js只能实现public和private两种封装性; //js中类表现为构造器:[/b]
多态:
类型的模糊(as):js是弱类型的,因为任何一个实例的类型都是基本类型中的object,因此js这种语言本身就是类型模糊的;
类型的确认(is):
instanceof判断;
实例能否使用该方法取决于它有没有该方法,而不取决于它是不是某种类型;
js无法依赖父类的同名方法;
实现:
一般方法:
在构造器中写this实例引用; //这里并没用到原型
在构造器中直接返回对象(实例);//这里并不是返回这个构造器的原型;
修改原型;
重写原型;
继承原型;
类抄写:demo
成员总是指向父类的构造器;
实例构造逻辑:先传入父类this引用抄写父类方法,然后是传入子类this引用抄写子类方法;后者会覆盖前者;
优点:不追溯原型链,所有属性都在实例属性表中,效率高;
缺点:
以内存开销换效率; //创建实例其每个方法都要初始化;
不能用instanceof检测继承关系;
原型继承
以时间换空间,继承层次中邻近的成员访问最快,访问一个不存在的成员最久; // 与其被设计出来时的应用环境有关;
选择(参考):在大型系统上用类继承的思路;在小型结构或体系的局部使用原型继承思路;
对象属性:
内部属性:不能通过脚本来访问,具体定义与使用都与引擎自身的实现有关;
数据属性:
数据描述://至少有value或writable两个之一
value //undefined
writable //false
性质描述:
enumerable //false
configurable //false
存取属性:
存取描述://至少有set或get两个之一
get //undefined
set //undefined
性质描述
enumerable //false
configurable //false
直接量形式:
对象直接量中不存在对ennumerable,configurable的定义,默认为true;
writable值按照语法分析而定,一般为true;
定制对象属性:
Object.defineProperty(obj,name,desc);
Object.defineProperties(obj,props) : 在js引擎内部,事实上从props中for/in所有的name取出desc值,并以它们为参数逐一调用defineProperty();
Object.getOwnPropertyDescriptor(obj,name);
Object.create(prototypeObj,PropertyDescriptors): 在这个方案中,不需使用构造器,而是使用'原型继承+属性定义';
属性状态维护:
获取属性:
getOwnPropertyNames(obj) //取对象自有的属性名数组;
keys(obj) //取对象自有的,,可见的属性名数组
状态维护: //由原型继承来的属性同样会受影响; 以当前对象为原型时,子类可以通过重新定义同名属性来覆盖这些状态‘
preventExtensions(obj) //使实例obj不能添加新属性;
seal(obj) //使实例obj不能添加新属性;也不能删除既有属性;
freeze(obj) //使实例obj所有属性只读;且不能添加,删除属性;
状态检查:
isExtensible(obj);
isSealed(obj);
isFrozen(obj);
一把对象系统,封装是由语法解析来实现的,即语法作用域;但js是动态语言,因此只能依赖变量作用域;
[b]js的变量作用域只有表达式,函数,全局三种;所以js只能实现public和private两种封装性; //js中类表现为构造器:[/b]
function MyObject () { //private var data = 100; function _run(v) { alert(v); } //pbulic this.value = 'the data is '; this.run = function() { _run(this.value + data); } } var obj = new MyObject(); obj.run();
多态:
类型的模糊(as):js是弱类型的,因为任何一个实例的类型都是基本类型中的object,因此js这种语言本身就是类型模糊的;
类型的确认(is):
instanceof判断;
实例能否使用该方法取决于它有没有该方法,而不取决于它是不是某种类型;
js无法依赖父类的同名方法;
实现:
一般方法:
在构造器中写this实例引用; //这里并没用到原型
function MyObject1() { this.name = 'jinks'; } var obj1 = new MyObject1();
在构造器中直接返回对象(实例);//这里并不是返回这个构造器的原型;
function MyObject2() { var name = 'jinks'; return { name : name } } var obj2 = new MyObject2();
修改原型;
function MyObject3() { } MyObject3.prototype.name = 'jinks'; MyObject3.prototype.age = '22'; var obj3 = new MyObject3();
重写原型;
function MyObject4() { } MyObject4.prototype = { name : 'jinks', age : '22' } MyObject4.prototype.constructor = MyObject4; var obj4 = new MyObject4();
继承原型;
MyObject5.prototype = new ParentClass();
类抄写:demo
成员总是指向父类的构造器;
实例构造逻辑:先传入父类this引用抄写父类方法,然后是传入子类this引用抄写子类方法;后者会覆盖前者;
优点:不追溯原型链,所有属性都在实例属性表中,效率高;
缺点:
以内存开销换效率; //创建实例其每个方法都要初始化;
不能用instanceof检测继承关系;
原型继承
以时间换空间,继承层次中邻近的成员访问最快,访问一个不存在的成员最久; // 与其被设计出来时的应用环境有关;
选择(参考):在大型系统上用类继承的思路;在小型结构或体系的局部使用原型继承思路;
对象属性:
内部属性:不能通过脚本来访问,具体定义与使用都与引擎自身的实现有关;
数据属性:
数据描述://至少有value或writable两个之一
value //undefined
writable //false
性质描述:
enumerable //false
configurable //false
存取属性:
存取描述://至少有set或get两个之一
get //undefined
set //undefined
性质描述
enumerable //false
configurable //false
直接量形式:
对象直接量中不存在对ennumerable,configurable的定义,默认为true;
writable值按照语法分析而定,一般为true;
定制对象属性:
Object.defineProperty(obj,name,desc);
Object.defineProperties(obj,props) : 在js引擎内部,事实上从props中for/in所有的name取出desc值,并以它们为参数逐一调用defineProperty();
Object.getOwnPropertyDescriptor(obj,name);
Object.create(prototypeObj,PropertyDescriptors): 在这个方案中,不需使用构造器,而是使用'原型继承+属性定义';
function aCreator(proto, props) { if(!(prop instanceof Object)) throw TypeError var obj,_proto_ = Object.prototype; try{ Object.prototype = proto; obj = new Object(); } finally { Object.prototype = _proto_; } Object.defineProperties(obj,props); return obj; }
属性状态维护:
获取属性:
getOwnPropertyNames(obj) //取对象自有的属性名数组;
keys(obj) //取对象自有的,,可见的属性名数组
状态维护: //由原型继承来的属性同样会受影响; 以当前对象为原型时,子类可以通过重新定义同名属性来覆盖这些状态‘
preventExtensions(obj) //使实例obj不能添加新属性;
seal(obj) //使实例obj不能添加新属性;也不能删除既有属性;
freeze(obj) //使实例obj所有属性只读;且不能添加,删除属性;
状态检查:
isExtensible(obj);
isSealed(obj);
isFrozen(obj);
相关文章推荐
- js:语言精髓笔记4----面向对象概要与运算符二义性
- js:语言精髓笔记3----语句
- js:语言精髓笔记9--函数式语言特征
- js:语言精髓笔记6----作用域
- js:语言精髓笔记11--动态语言特性(1)
- js:语言精髓笔记1--标识符与基本类型
- js:语言精髓笔记7----原型继承
- js:语言精髓笔记13--语言技巧
- JS语言精粹学习笔记--对象字面量
- js:语言精髓笔记12--动态语言特性(2)
- js:语言精髓笔记10--闭包
- js:语言精髓笔记5----语言分类
- js:语言精髓笔记2--表达式
- [1009]JS语言精髓与编程实践笔记1
- js内置对象【学习笔记】
- 分析CMMS系统笔记---使用js控制快捷键
- JS精髓笔记
- js 读书笔记1---对象比较
- 程序库和面向对象语言——unix编程艺术学习笔记
- js高级编号笔记[新]-9个核心对象