zoukankan      html  css  js  c++  java
  • 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();
    • 类抄写: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);
  • 相关阅读:
    leetcode之String to Integer (atoi)
    初次思考
    leetcode之Reverse Words in a String
    Leetcode之Database篇
    在项目中添加类
    创建项目
    配置Eclipse

    递归
    多态
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4083602.html
Copyright © 2011-2022 走看看