关于对象

对象的特性: 1.继承性 2.封装性 3.多态性
对象的属性和方法可以重写(子类重写父类的方法);但不能重载(JS中没有重载,但可以通过参数个数的判断来模拟重载)。

创建对象的方式:

1.字面量形式:    var obj = {}

2.内置对象创建:  var obj = new Object();

3.构造函数创建:  function Test(){}  var obj = new Test()

4.混合模式创建: function Text(){}  Text.prototype={}  var obj = new Text()
    解决了方法或属性公有的问题,把实例之间相同的属性和方法提取成公有的属性和方法,想让谁公有就把他放到构造函数的prototype上即可。

5.工厂模式创建: function newObj(name,age,fn){
                    var obj = {};
                    obj.name = name,
                    obj.age = age,
                    obj.fn = function(){}
                    return obj;
                 }
                 var obj = newObj('name','age')
                也称'函数的封装'(低耦合高内聚:减少页面中的冗余代码,提高代码的重复利用率)


工厂模式、构造函数、混合模式创建的区别:

工厂模式:实例化不需要使用new关键字,在创建函数时需要手动创建一个对象并返回这个对象。
构造函数: 实例化需要new关键字,在创建构造函数的时候不需要手动创建一个对象;实例化的对象之间是相互独立的,每实例化一个对象就要在内存中开辟一份空间;
混合模式:在原型上的方法和属性是共有的,实例化对象时,这些共有的属性和方法只占用一份内存空间。


构造函数的返回值

1.在构造函数中浏览器会默认的把实例返回(返回的是一个对象数据类型的值)
2.手动return : 如果return的是简单数据类型:当前实例不变
            如果return的是复杂数据类型:替换当前的实例

原型链:
JS通过原型链来实现继承性;

属性搜索法则:

首先在对象的私有属性上查找,如果私有中存在这个属性,则获取私有属性;
如果私有没有,则通过__proto__找到所属类的原型(类的原型上定义的属性和方法都是当前实例公有的属性和方法),原型上存在,获取的是公有的属性值;
如果原型上也没有。则继续通过原型上的__proto__继续向上查找,一直查找到Object.prototype,
如果还没有就返回undefined;


关于原型:
1.每一个函数数据类型(普通函数和类)都有个天生自带的属性:prototype,并且这个属性是一个对象数据类型的值。
2.并且在prototype上浏览器天生给它加了一个属性:constructor(构造函数),属性值是当前函数(类)本身。
3.每一个对象数据类型(普通对象、实例、prototype)也天生自带一个属性:__proto__,属性值是当前实例所属类的原型(prototype)。
4.Object是Js中所有对象数据类型的基类(最顶层的类); 
  F1 instanceof Object 结果是true,因为f1通过__proto__可以向上级查找,不管多少级最后总能找到object;
  在object.prototype上没有__proto__;

检测是否有某个属性:
attr in object 检测某个属性是否属于这个对象
hasOwnProperty 检测某个属性是否为这个对象的私有属性
     Console.log( obj.hasOwnProperty (“attr”))
isPrototypeOf  是否为prototype上的属性
posted @ 2017-06-29 20:14  rainbow8590  阅读(112)  评论(0编辑  收藏  举报