You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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()
使用 extends 实现继承,更简单,不会破坏 instanceof 运算的危险。
实例对象继承(非构造函数的继承)
简单的把父对象的属性,全部拷贝给子对象,也能实现继承
如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现只要递归调用"浅拷贝"就行了。
引伸数组的常用方法拷贝
返回一个
新的数组
,不影响父数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。该方法不会改变现有的数组,而仅仅会返回被连接
数组的一个副本
。ES6 中,扩展运算符也能很方便的拷贝数组
注意 splice 不能实现数组拷贝
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目,该方法会
改变原始数组
。由此,也发现
splice
与slice
区别,splice会改变原生数组,而slice返回一个新的数组。参考:
从__proto__和prototype来深入理解JS对象和原型链
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承
Object.create()
The text was updated successfully, but these errors were encountered: