对象的特性: 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上的属性