对象_原型

问题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'

上面代码中,构造函数Animalprototype对象,就是实例对象cat1cat2的原型对象。在原型对象上添加一个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";

上面代码中,实例对象cat1color属性改为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 对象则会在页面上创建一个回到顶部的元素,点击页面滚动到顶部。拥有以下属性和方法

  1. ct属性,GoTop 对应的 DOM 元素的容器
  2. target属性, GoTop 对应的 DOM 元素
  3. bindEvent 方法, 用于绑定事件
  4. createNode 方法, 用于在容器内创建节点

链接

问题7: 使用木桶布局实现一个图片墙

链接

推荐阅读更多精彩内容