Object.create()方法
作用:创建对象并设置原型对象
语法:var o=Object.create(obj) //创建一个空对象,并且设置这个空对象的原型对象为obj
注意点:兼容问题(ES5)
01 先判断是否支持这个Object.create方法,如果不支持,再利用对象的动态特性自己提供一个方法.
代码示例
var obj = {
name:"张三",
showName:function () {
console.log(this.name);
}
};
var o;
if(typeof Object.create == "function")
{
o = Object.create(obj);
}else
{
//o = {};
//o.__proto__ = obj; //非标准的属性
// Object.getPrototypeOf(o) = obj;
Object.create = function (obj) {
function F() {};
F.prototype = obj;
o = new F();
}
}
02 提供一个函数来封装这个功能,在函数内部先判断是否支持Object.create。 如果支持那么就使用Object.create,否则我们就自己实现
代码示例
var obj = {
name:"张三",
showName:function () {
console.log(this.name);
}
};
function create(objT) {
if (typeof Object.create == "function") {
return Object.create(objT);
} else
{
function F() {};
F.prototype = objT;
return new F();
}
}
//调用函数
var o = create(obj);
Object.assign()方法
作用:用来拷贝属性,一次性拷贝多个属性
语法:Object.assign(要拷贝属性的对象,被拷贝对象1,被拷贝对象2)
注意点:
- 新特性有兼容问题
- 原型成员能否被拷贝(否)
! 使用for...in循环拷贝,会将原型成员也拷贝,并且使用in关键字来判断方法包括原型方法
代码示例
var o = {};
Object.assign(o, {name:"张三"},{age:20},{showName:function () {
console.log("name");
}});
console.log(o);
o.showName(); //name
function F() {}
F.prototype.hi = "hi";
var f = new F();
var obj = {};
for (var i in f)
{
// 使用for....in循环只拷贝实例成员
if(f.hasOwnProperty(i)) //hasOwnProperty方法只判断实例成员,将原型成员过滤出去
{
obj[i] = f[i];
}
}
console.log(obj.hi);
var demo = {};
Object.assign(demo,f);
console.log(demo.hi); //undefined
call与apply函数(重点)
所有的对象方法都拥有这两个函数,所以这两个函数写在function.prototype上。
作用:借用其他对象的方法
语法:
01 对象1.方法.call(借用者对象,参数1,参数2...) //方法内部的this指向call的第一个参数
02 对象1.方法.apply(借用者对象,[参数1,参数2.......])
两种方法的区别:
- 传递参数的形式不一样
- 两者期望参数长度不一样
代码示例
var p1 = {
name:"张三",
showName:function () {
console.log(this.name);
},
showDes:function (str1,str2) {
console.log("des" + str1,str2);
}
};
var p2 = {
name:"李四"
};
p1.showName(); //张三
p1.showName.call(p2); //p2借用p1对象的showName方法
p1.showName.apply(); //window.name = 空("")
//注意call和apply传递参数的区别
p1.showDes.call(p2, "啦啦啦啦,暗黑魔法咒语","伏地魔");
p1.showDes.apply(p2,["啦啦啦啦,暗黑魔法咒语","哈利波特"]);
function demo(str1,str2,str3) {
}
console.log(demo.length); //3.形参的长度,argument.length是实参的长度
console.log(p1.showDes.call.length); //1
console.log(p1.showDes.apply.length); //2
网友评论