从零开始学 Web 之 JS 高级(二)原型链,原型的继承 (2)

Person.call(this, name, age);第一个参数 this,表示当前对象,意思是当前对象呼叫 Person,将 name 和 age 传过来,具体传多少,我自己指定。这样不同的子类,通过自己可以设置不同的属性。

缺陷2:stu.eat();不能访问了,就是父类原型方法不能继承了。

解决办法组合继承(原型方式继承 + 借用构造函数继承)

function Person(name, age) { this.name = name; this.age = age; } Person.prototype.eat = function () { console.log("eat()"); }; function Student(name, age, sex) { Person.call(this, name, age); // 借用父类构造函数,实现父类属性的继承 this.sex = sex; } Student.prototype = new Person(); // 不传参数了,实现原型方法的继承 Student.prototype.study = function () { console.log("study()"); }; var stu = new Student("Daotin", 18, "male"); console.log(stu.name); console.log(stu.age); console.log(stu.sex); stu.eat(); stu.study();

Student.prototype = new Person();// 不传参数了,实现原型方法的继承。

Person.call(this, name, age);// 借用父类构造函数,实现父类属性的继承。

2、拷贝继承

就是把对象中需要共享的属性和方法直接以遍历的方式复制到了另一个对象中。

function Person(name, age) { this.name = name; this.age = age; } Person.prototype.eat = function () { console.log("eat()"); }; var per = {}; // 循环拷贝 for(var key in Person.prototype) { per[key] = Person.prototype[key]; } console.log(per); 三、复习 1、函数的声明和函数表达式的区别 // 函数的声明 if(true) { function f1() { console.log("f1()--1"); } } else { function f1() { console.log("f1()--2"); } } f1();

函数声明如果放在 if-else- 里面,chrome 和 firefox 输出 f1()--1,IE8 下输出 f1()--2,因为函数声明会提前,第二个将第一个覆盖了。

// 函数表达式 var func; if(true) { func = function () { console.log("f1()--1"); }; } else { func = function () { console.log("f1()--2"); }; } func();

函数表达式的方式,输出都是 f1()--1。所以尽量使用函数表达式。

2、严格模式 function func() { console.log(this) // window } func();

正常情况下是证正确的。

"use strict"; function func() { console.log(this) // window } window.func(); // 严格模式下必须加 window,因为他认为函数是一个方法,方法必须通过对象来调用的。

2.1、函数也是对象,对象不一定是函数(比如:Math)。

只要有 __proto__ 的就是对象;

只有要 prototype 的就是函数,因为函数才会调用 prototype 属性。

对象不一定是函数:比如 Math,中有 __proto__ ,但是没有 prototype。

2.2、所有的函数都是由 Function 构造函数创建的实例对象。

既然函数是对象,那么是什么构造函数创建的呢?

var f1 = new Function("a", "b", "return a+b"); f1(1,2); // 上面相当于:函数的声明 function f1(a, b) { return a+b; } f1(1,2); // 相当于:函数表达式 var f1 = function (a, b) { return a+b; } f1(1,2);

那么 Function 是个什么东西呢?

经查看是对象也是函数?然后查看它的 __proto__ 指向的是 Object的原型对象。所有的对象指向的都是Object的原型对象。

从零开始学 Web 之 JS 高级(二)原型链,原型的继承

Web前端之巅

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdpgj.html