js:语言精髓笔记8--对象系统
封装:
- 一把对象系统,封装是由语法解析来实现的,即语法作用域;但js是动态语言,因此只能依赖变量作用域;
- js的变量作用域只有表达式,函数,全局三种;所以js只能实现public和private两种封装性; //js中类表现为构造器:
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();
- 在构造器中写this实例引用; //这里并没用到原型
- 类抄写:demo
- 成员总是指向父类的构造器;
- 实例构造逻辑:先传入父类this引用抄写父类方法,然后是传入子类this引用抄写子类方法;后者会覆盖前者;
- 优点:不追溯原型链,所有属性都在实例属性表中,效率高;
- 缺点:
- 以内存开销换效率; //创建实例其每个方法都要初始化;
- 不能用instanceof检测继承关系;
- 原型继承
- 以时间换空间,继承层次中邻近的成员访问最快,访问一个不存在的成员最久; // 与其被设计出来时的应用环境有关;
- 选择(参考):在大型系统上用类继承的思路;在小型结构或体系的局部使用原型继承思路;

对象属性:
- 内部属性:不能通过脚本来访问,具体定义与使用都与引擎自身的实现有关;
- 数据属性:
- 数据描述://至少有value或writable两个之一
- value //undefined
- writable //false
- 性质描述:
- enumerable //false
- configurable //false
- 数据描述://至少有value或writable两个之一
- 存取属性:
- 存取描述://至少有set或get两个之一
- get //undefined
- set //undefined
- 性质描述
- enumerable //false
- configurable //false
- 存取描述://至少有set或get两个之一
- 直接量形式:
- 对象直接量中不存在对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:语言精髓笔记8--对象系统的更多相关文章
- js:语言精髓笔记12--动态语言特性(2)
对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...
- js:语言精髓笔记9--函数式语言特征
形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...
- js:语言精髓笔记7----原型继承
面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...
- js:语言精髓笔记5----语言分类
计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类: //编程的经典法则 ...
- js:语言精髓笔记1--标识符与基本类型
标识符: 命名: 语法以及类型----语法关键字 //逻辑 值(的存储位置)----变量和常量 ...
- js:语言精髓笔记4----面向对象概要与运算符二义性
实例创建:obj = new contructor[(arguments)]; //如果没有参数可以忽略括号:所以注意这不是函数调用: 直接量与初始器:在之前的基本表达式中将直接量与初始器分开,这时因 ...
- js:语言精髓笔记11--动态语言特性(1)
语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...
- js:语言精髓笔记10--闭包
闭包: //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...
- js:语言精髓笔记6----作用域
js基础语法:由语句.表达式和变量构成: 语句是主要表达方式:单语句->复合语句(代码块)->程序片段(函数):js中没有单元和程序的概念: 作用域: 语法作用域与变量作用域的区别:前 ...
随机推荐
- 简单聊下Unicode和UTF-8
今晚听同事分享提到这个,简单总结下. ## Unicode字符集 Unicode的出现是因为ASCII等其他编码码不够用了,比如ASCII是英语为母语的人发明的,只要一个字节8位就能够表示26个英文字 ...
- WiFi入口流量O2O微应用平台
WiFi入口流量O2O微应用平台 随着智能手机一年比一年销量大好,传统的互联网的流量争夺战场已经转向了移动互联网,各大巨头纷纷出招,智能wifi路由器就是其中最重要的一块战略高地.所谓的智能路由器,解 ...
- LR 测试数据库总结
今天工作中需要对mysql进行性能测试 我尝试用LR来做:但是mysql需要现在电脑上安装一个OBDC的mysql驱动器,然后在电脑的管理工具中的数据源中加入这个mysql驱动,测试连接数据库成功,O ...
- session 实现登录功能注意事项
php5之后废除了session_unregister()函数,可以用 session_destory().其他的也都没有啥了,还有就是输出嵌入的PHP代码用=代码见我的git:https://git ...
- Stanford机器学习---第八讲. 支持向量机SVM
原文: http://blog.csdn.net/abcjennifer/article/details/7849812 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回 ...
- PCA
理论部分可以看斯坦福大学的那份讲义,通俗易懂:http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html opencv中有PCA这 ...
- Windows上搭个Nginx集群环境玩玩
一.在windows上安装nginx 1.从这里下载nginx的windows版本 2.把压缩文件解压至c盘根目录,并将文件夹重命名成nginx 3.在conf目录下的nginx.conf文件中,指定 ...
- C++ traits
[本文链接] http://www.cnblogs.com/hellogiser/p/cplusplus-traits.html [分析] 什么是traits?其实它并不是一个新的概念,上个世纪90年 ...
- 【转】Solr从数据库导入数据(DIH)
本文转自:http://blog.csdn.net/xiaoyu714543065/article/details/11849115 一. 数据导入(DataImportHandler-DIH) DI ...
- Android 启动画面
如果你的程序初始化时间过长,那么在初始化之前,程序会现实一个空白的activity页,十分难看. 添加一个启动画面的方法就是为响应的activity加入自定义的Theme,并在theme中设定 and ...