问题1: OOP 指什么?有哪些特性
Object Oriented Programming
面向对象编程
面向对象语言的三大特性:
- 封装(Encapsulation): 把相关的信息(无论数据或方法)存储在对象中的能力
- 继承(Inheritance): 由另一个类(或多个类)得来类的属性和方法的能力
- 多态(Polymorphism): 编写能以多种方法运行的函数或方法的能力
其他的一些内容:
- 类(Class): 定义了一件事物的抽象特点, 用来构造对象
- 对象(Object): 类的实例化
- 属性(Property): 对象具有的数据
- 方法(Method): 也成消息,用于对象之间传递数据
问题2: 如何通过构造函数的方式创建一个拥有属性和方法的对象?、
function foo(name,age){
this.name = name
this.age = age
this.sayHello = function(){
console.log('Hello my name is ' + this.name)
}
}
var info = new foo('Quincy', 24)
问题3: prototype 是什么?有什么特性
JavaScript 的每个对象都继承另一个对象,后者称为“原型”(prototype)对象。只有null
除外,它没有自己的原型对象。
原型对象上的所有属性和方法,都能被派生对象共享。这就是 JavaScript 继承机制的基本设计。
通过构造函数生成实例对象时,会自动为实例对象分配原型对象。每一个构造函数都有一个prototype
属性,这个属性就是实例对象的原型对象。
function Animal (name) {
this.name = name;
}
Animal.prototype.color = 'white';
var cat1 = new Animal('大毛');
var cat2 = new Animal('二毛');
cat1.color // 'white'
cat2.color // 'white'
上面代码中,构造函数Animal
的prototype
对象,就是实例对象cat1
和cat2
的原型对象。在原型对象上添加一个color
属性。结果,实例对象都能读取该属性。
原型对象的属性不是实例对象自身的属性。只要修改原型对象,变动就立刻会体现在所有实例对象上。
Animal.prototype.color = 'yellow';
cat1.color // "yellow"
cat2.color // "yellow"
上面代码中,原型对象的color
属性的值变为yellow
,两个实例对象的color
属性立刻跟着变了。这是因为实例对象其实没有color
属性,都是读取原型对象的color
属性。也就是说,当实例对象本身没有某个属性或方法的时候,它会到构造函数的prototype
属性指向的对象,去寻找该属性或方法。这就是原型对象的特殊之处。
如果实例对象自身就有某个属性或方法,它就不会再去原型对象寻找这个属性或方法。
cat1.color = 'black';
cat2.color // 'yellow'
Animal.prototype.color // "yellow";
上面代码中,实例对象cat1
的color
属性改为black
,就使得它不再去原型对象读取color
属性,后者的值依然为yellow
。
总结一下,原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因,而实例对象可以视作从原型对象衍生出来的子对象。
Animal.prototype.walk = function () {
console.log(this.name + ' is walking');
};
上面代码中,Animal.prototype
对象上面定义了一个walk
方法,这个方法将可以在所有Animal
实例对象上面调用。
由于 JavaScript 的所有对象都有构造函数(只有null
除外),而所有构造函数都有prototype
属性(其实是所有函数都有prototype
属性),所以所有对象都有自己的原型对象。
问题4:画出如下代码的原型图
function People (name){
this.name = name;
this.sayName = function(){
console.log('my name is:' + this.name);
}
}
People.prototype.walk = function(){
console.log(this.name + ' is walking');
}
var p1 = new People('饥人谷');
var p2 = new People('前端');
问题5: 创建一个 Car 对象,拥有属性name、color、status;拥有方法run,stop,getStatus
function Car(name,color){
this.name = name
this.color = color
this.speed = 0
this.status = this.getStatus()
}
Car.prototype.run = function(){
this.speed += 10
}
Car.prototype.stop = function(){
this.speed = 0
}
Car.prototype.getStatus = function(){
return this.speed > 0 ? 'Running' : 'Stopping'
}
问题6: 创建一个 GoTop 对象,当 new 一个 GotTop 对象则会在页面上创建一个回到顶部的元素,点击页面滚动到顶部。拥有以下属性和方法
-
ct
属性,GoTop 对应的 DOM 元素的容器 -
target
属性, GoTop 对应的 DOM 元素 -
bindEvent
方法, 用于绑定事件 -
createNode
方法, 用于在容器内创建节点