您的位置:首页 > Web前端 > JavaScript

js:语言精髓笔记8--对象系统

2014-11-08 16:35 204 查看
封装:

一把对象系统,封装是由语法解析来实现的,即语法作用域;但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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: