面向对象相关知识总结
//1.hasOwnPrototype 判断是都是当前对象的自有属性var obj ={name:"zhangsan"};console.log(obj.hasOwnProperty("name"));//true//2.isPrototypeOf 判断是否是传入对象的原型对象functionFun(){}var fun=newFun();console.log(Fun.prototype.isPrototypeOf(fun));//true//console.log(obj.prototype.isPrototypeOf(obj));报错不是这样用的!!//3.propertyIsEnumerable 表示参数是否是当前对象的可枚举(可以使用for in 遍历)属性//4.Object.defineProperty() 为一个对象定义一个属性Object.defineProperty(obj,"age",{set:function(value){if(typeof value ==="number"&& value >=18){this.age = value;}else{console.log("年龄未满18岁");}},get:function(){return age;}});var o1={};//添加了一个name属性,值为"高通"Object.defineProperty(o1,"name",{value:"高通"});//添加了一个不可枚举属性,值为"170"Object.defineProperty(o1,"length",{enumerable:false,value:"170"});//添加一个不可使用赋值运算符的属性Object.defineProperty(o1,"age",{writable:false,value:18});o1.age=30;console.log(o1.age);//18//定义一个不可被删除的属性Object.defineProperty(o1,"color",{configurable:true,//值为true表示该属性可以被删除,值为false表示该属性不可被删除value:"黄种人"});//定义一个只读(只能获取值)属性Object.defineProperty(o1,"number",{get:function(){return30;}});//定义一个只写属性Object.defineProperty(o1,"gender",{set:function(v){console.log(v);}});//5.instanceOf arr是否是Array的实例var arr=[1,2,3];console.log(arr instanceof Array);//true//constructorconsole.log(Fun.prototype.constructor===Fun);//true
1.继承的六种方式
/*实现继承的六种方式*//*1.扩展原型对象的方法实现继承*/functionFoo1(){}//在Foo1函数上扩展一个fn1方法,由构造函数创建的对象都具有fn1这个方法Foo1.prototype.fn1=function(){};/*2.替换原型对象实现继承*/functionFoo2(){}//给Foo2函数的原型对象重新赋值,注意不要忘记添加constructor属性Foo2.prototype={constructor:Foo2,fn1:function(){},fn2:function(){}};/*3.混入继承*///已知两个对象,obj2对象继承obj中的属性obj={name:"张三",age:16};obj2={};for(var key in obj){obj2[key]=obj[key];}//封装一个函数function mixin(target,source){for(var key in source){target[key]=source[key];}return target;}//jQuery中的extend方法就使用了混入继承/*4.混入+原型继承*///给Foo4.prototype混入一些新的方法functionFoo4(){}mixin(Foo4,{fn1:function(){},fn2:function(){}});//jQuery中的jQuery.fn.extend()就是使用了这个方法// jQuery.fn==jQuery.prototypejQuery.fn.extend=function(obj){for(var key in obj){jQuery.fn[key]=obj[key];}return jQuery.fn;};/*5.经典继承*/var obj5={name:"liying",age:18};functionFoo5(){};Foo5.prototype=obj5;//封装一个方法function getFun(obj5){//传入已知的对象function F(){}F.prototype=obj5;returnnew F();//将继承创建的对象返回}//经典继承在ES5中得到了实现,Object.create()/*6.借用构造函数实现继承*/functionFoo6(name,age){this.name=name;this.age=age;}functionNewFoo(name,age,number){Foo6.call(this,name,age);this.number=number;}//newFoo构造函数借用Foo6构造函数中的属性和方法var obj =newNewFoo("张三",18,10);console.log(obj);//NewFoo {name: "张三", age: 18, number: 10}
2.创建对象的几种方式
/*1.对象字面量*/var obj1 ={name:"zhangsan",age:18};/*2.构造函数创建对象*/functionFun(){}var obj2 =newFun();/*3.Object创建对象*/var obj3 =newObject();//动态的给obj3添加属性obj3.name="zhangsan";/*4.工厂模式*///定义一个函数用来创建对象那个,只要调用一个这个函数就创建了以对象function createObj(name){var obj =newObject();obj.name=name;//变化的属性obj.sex="男";//这个方法创建的对象共有的方法obj.say=function(){console.log("说话的方法");}}/*5.原型创建对象*///所有的属性方法都放在原型中,存在一个问题就是这样创建出来的实例对象是完全一致的functionRole(){}Role.prototype.name="zhangsan";Role.prototype.age=18;var role =newRole();/*6.混合方式创建对象构造+原型*/functionPerson(name){var obj=newObject();obj.name=name;//不同的属性通过构造函数}Person.prototype.sex="男";//共同的不会改变的属性放在原型中
3.函数调用的几种方式
function fn(){console.log(this.name);return"fn函数的返回值";}/*1.方法调用*///方法调用,this指向window,相当于是window调用fn();/*2.对象调用*/var obj={name:"zhangsan",fun:function(){console.log(this.name+"zhangsan的方法");}};obj.fun();//函数中的this指向obj/*3.构造函数调用*/var fns =new fn();//函数中的this指向函数的实例也就是fns//对于构造函数的返回值问题/*1.如果构造函数没有return语句,返回值默认为实例对象* 2.如果return 基本类型数据;返回值为实例对象* 3.如果return 对象;返回值为return中的对象* */console.log("****************");/*4.上下文调用模式call() apply()*/var obj4={say:function(){console.log("说话的方法");}};var obj5 ={name:"zhangsan"};//obj5对象想使用obj4的say方法obj4.say.call(obj5);/** call(对象,参数1,参数2....)* apply(对象,[参数1,参数2,参数3])* */
4.原型链


浙公网安备 33010602011771号