面向对象
1、原则:开放封闭原则
1、对于扩展是开放的(open for extension)。当应用的需求改变时,可以对模块进行扩展,使其满足改变的新行为。
2、 对于修改是关闭的(close for modification)。对模块进行扩展时,不必改变模块的源代码。
2、三要素:封装,继承,多态
1、封装:把很多个属性和方法封装到一个对象当中。2、继承:继承一个对象的所有的属性和方法。3、多态:不同的对象对同一个方法有不同的表现
new操作
var object=new Object()时,都发生了什么?
1、创建了一个空对象作为this
2、this.proto指向构造函数的prototype
3、运行构造函数
4、返回this(如果构造函数里没有return,若存在return引用类型,则返回return后的值)
1 | var Foo=function(){ |
原型链
解释Person、 prototype、proto、p、constructor之间的关联。
1 | function Person(name){ // 不能用箭头函数,不然不能new |
上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
- 原型链:对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型对象本身也是对象,也有自己的原型,依次类推,形成了一条原型链(prototype chain)。
- 如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性指向的那个对象。Object.prototype对象的原型为null,而null没有原型对象
- 「原型链」的作用是,读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined
数值,字符串,布尔值,函数,对象,数组的定义
1 | let num = new Number() // Number{0} |
继承
继承有什么作用?
1、子类拥有父类的属性和方法,不需要重复写代码,修改时也只需修改一份代码
2、可以重写和扩展父类的属性和代码,又不影响父类本身
下面两种写法有什么区别?
1 | //方法1 |
Object.create 有什么作用?兼容性如何?
1、Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
Object.create(proto, [ propertiesObject ]):第一个参数必选,是一个对象的原型,第二个开始参数可选,为属性对象
2、Object.create是 ES5 中规定的,IE9 以下无效。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function grandfather(name) {
this.name = name;
};
grandfather.prototype.say = function() {
console.log('My name is ' + this.name);
};
function father(name) {
grandfather.call(this,name); //调用grandfather,并把函数内的this替换了
};
father.prototype = Object.create(grandfather.prototype);
//把father.prototype._proto_指向了grandfather.prototype,fater.prototype没有定义的原型方法了
// 此时的father.prototype.constructor ==== grandfather
father.prototype.constructor = father; //设置father.prototype.constructor
// 重新定义fater.prototype上的原型方法了
father.prototype.say2 = function() {
console.log(111)
}
var p1 = new father('Ethan');
Object.getPrototypeOf() 获取指定对象的原型
1 | let a = {a:1} |
分别用2种方式进行继承:Object.create, proto
1 | function grandFather(){} |
hasOwnProperty有什么作用? 如何使用?
hasOwnProperty 是 Object.prototype 的一个方法,可以判断一个对象是否包含自定义属性而不是原型链的属性,hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。1
2
3
4
5function P(name){this.name=name;}
P.prototype.say=function(){console.log(this.name);}
var obj=new P("Ethan");
obj. hasOwnProperty("name"); //true
obj. hasOwnProperty("say"); //false
如下代码中call的作用是什么?
1 | function Person(name, sex){ |
继承的几种方式
1、借助构造函数
1 | function Parent1() { |
2、通过原型链实现继承
1 | function Parent() { |
3、利用Object.create(A)
1 | function Person (name, age) { |
4、class关键字
1 | class Person { |