面向对象相关知识总结
Posted itly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关知识总结相关的知识,希望对你有一定的参考价值。
//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
//constructor
console.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.prototype
jQuery.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.原型链
以上是关于面向对象相关知识总结的主要内容,如果未能解决你的问题,请参考以下文章