function Parent(name){
this.name= name || "adam",
this.age="24";
}
Parent.prototype.say = function () {
return this.name
}
function Child(name){
Parent.apply(this, arguments)
}
var child = new Child()
缺点:子类无法继承父类 prototype 共享属性,原型链断裂。
2.借用和设置原型:
function Parent(){
this.name = "adam"
}
Parent.prototype.say = function () {
return this.name
}
function Child(){
Parent.call(this)
}
Child.prototype = new Parent()
Child.prototype.constructor = Child
var child = new Child()
//使用splice()
var x = [14, 3, 77]
var y = x.splice(1, 2)
console.log(x) // [14]
console.log(y) // [3, 77]
//使用slice()
var x = [14, 3, 77];
var y = x.slice(1, 3);
console.log(x); // [14, 3, 77]
console.log(y); // [3,77]
代码复用之继承
原型链的继承
缺点
:子类无法继承父类prototype
共享属性,原型链断裂。缺点
:实现继承原型,同时继承了两个对象的属性,即添加到this的属性以及原型属性。在绝大多数的时候,并不需要这些自身的属性,因为它们很可能是指向一个特定的实例,而不是复用。优点
: 效率比较高(不用执行和建立父类Parent的实例了),比较省内存。缺点
: 子类Child.prototype和父类Parent.prototype现在指向了同一个对象,那么任何对Child.prototype的修改,都会反映到Parent.prototype,影响作用域。此种方式最优,也被大多数框架库所采用,节省内存效率较高。
Object.create()
实例对象继承(非构造函数的继承)
简单的把父对象的属性,全部拷贝给子对象,也能实现继承
如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现只要递归调用"浅拷贝"就行了。
引伸数组的常用方法拷贝
返回一个
新的数组
,不影响父数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。该方法不会改变现有的数组,而仅仅会返回被连接
数组的一个副本
。ES6 中,扩展运算符也能很方便的拷贝数组
注意 splice 不能实现数组拷贝
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目,该方法会
改变原始数组
。由此,也发现
splice
与slice
区别,splice会改变原生数组,而slice返回一个新的数组。参考:
从proto和prototype来深入理解JS对象和原型链
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承
Object.create()