javascript 实现继承的几种方式
1. 拷贝属性方式:
- 如果属性的值是引用类型的,
- 那么子对象和父对象共享一块数据,
- 修改了某个对象对另外一个对象有影响
- var obj1 = {
- name: "静静的顿河",
- des: "我在静静的看着这条河",
- friends: ["哗啦哗啦", "哈出哈赤", "哔哩哔哩", "哈拉哈拉"]
- }
- var obj2 = {}; //obj2要能够拥有obj1的属性 for (var k in obj1) { obj2[k] = obj1[k]; } console.log(obj2.friends); console.log(obj1.friends); //更新obj1的引用类型的属性值(如这里的friends数组),obj2也会受影响。 obj1.friends.push("乌拉乌拉"); console.log(obj2.friends);
- //实现拷贝的另一种方式,使用Object.assign(),其中第一个参数是目标对象,第二个,第三个参数是要拷贝属性的对象,同样的这种拷贝方式在拷贝引用类型属性时只能拷贝地址 var o = {}; var obj1 = {name:"name"}; var obj2 = {age:20}; var obj3 = {car:{type:"飞船"}}; Object.assign(o,obj2,obj1,obj3); console.log(o); obj3.car.type = '汽车'; console.log(o);
2. 原型式继承
存在问题:1. 构造器属性指向问题, 指向父构造函数,需要手动修正 2. 无法继承实例属性和方法只能够继承原型属性和方法
- 原型式继承A < script >
- function A() {}
- A.prototype.name = "默认的名称";
- var a1 = new A();
- var a2 = new A(); //利用:构造函数的原型对象上面的属性和方法可以被构造函数创建出来的对象所使用 console.log(a1.name); console.log(a2.name);</script>
- 原型式继承B < script >
- function A() {};
- A.prototype = {
- name: "默认的名称",
- // 手动修正原型对象的构造器 constructor:A } var a1 = new A(); var a2 = new A(); console.log(a1.name); console.log(a2.name);</script>
- 原型式继承C < script >
- function A() { // 设置实例属性 this.name = "默认名"; this.age = 30; }; //设置A的原型对象 A.prototype.des = "描述信息-A"; function B(){}; //设置B的原型等于A的原型,此时B的构造函数为A B.prototype = A.prototype; //手动修正B的原型对象的构造器 B.prototype.constructor = B; var b1 = new B(); var b2 = new B(); //b1和b2拥有des属性 console.log(b1.des,8); console.log(b2.des); //验证构造器属性 console.log(b1.constructor); console.log(b2.constructor); var a1 = new A(); console.log(a1.constructor); //无法获得父对象的实例属性 console.log(b1.name); //undefined console.log(b2.name);//undefined</script>
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/03-07/18276972.html