JS面向对象编程

论坛 期权论坛 期权     
前端初学者   2019-6-16 23:23   3501   0
avaScript的所有数据都可以看成对象,那是不是我们已经在使用面向对象编程了呢?
当然不是。如果我们只使用
  1. Number
复制代码
  1. Array
复制代码
  1. string
复制代码
以及基本的
  1. {...}
复制代码
定义的对象,还无法发挥出面向对象编程的威力。
JavaScript的面向对象编程和大多数其他语言如Java、C#的面向对象编程都不太一样。如果你熟悉Java或C#,很好,你一定明白面向对象的两个基本概念:
  • 类:类是对象的类型模板,例如,定义
    1. Student
    复制代码
    类来表示学生,类本身是一种类型,
    1. Student
    复制代码
    表示学生类型,但不表示任何具体的某个学生;
  • 实例:实例是根据类创建的对象,例如,根据
    1. Student
    复制代码
    类可以创建出
    1. xiaoming
    复制代码
    1. xiaohong
    复制代码
    1. xiaojun
    复制代码
    等多个实例,每个实例表示一个具体的学生,他们全都属于
    1. Student
    复制代码
    类型。
所以,类和实例是大多数面向对象编程语言的基本概念。
不过,在JavaScript中,这个概念需要改一改。JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。
原型是指当我们想要创建
  1. xiaoming
复制代码
这个具体的学生时,我们并没有一个
  1. Student
复制代码
类型可用。那怎么办?恰好有这么一个现成的对象:
  1. var robot = {    name: 'Robot',    height: 1.6,    run: function () {        console.log(this.name + ' is running...');    }};
复制代码
我们看这个
  1. robot
复制代码
对象有名字,有身高,还会跑,有点像小明,干脆就根据它来“创建”小明得了!
于是我们把它改名为
  1. Student
复制代码
,然后创建出
  1. xiaoming
复制代码
  1. var Student = {    name: 'Robot',    height: 1.2,    run: function () {        console.log(this.name + ' is running...');    }};var xiaoming = {    name: '小明'};xiaoming.__proto__ = Student;
复制代码
注意最后一行代码把
  1. xiaoming
复制代码
的原型指向了对象
  1. Student
复制代码
,看上去
  1. xiaoming
复制代码
仿佛是从
  1. Student
复制代码
继承下来的:
  1. xiaoming.name; // '小明'xiaoming.run(); // 小明 is running...
复制代码
  1. xiaoming
复制代码
有自己的
  1. name
复制代码
属性,但并没有定义
  1. run()
复制代码
方法。不过,由于小明是从
  1. Student
复制代码
继承而来,只要
  1. Student
复制代码
  1. run()
复制代码
方法,
  1. xiaoming
复制代码
也可以调用:

JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。
如果你把
  1. xiaoming
复制代码
的原型指向其他对象:
  1. var Bird = {    fly: function () {        console.log(this.name + ' is flying...');    }};xiaoming.__proto__ = Bird;
复制代码
现在
  1. xiaoming
复制代码
已经无法
  1. run()
复制代码
了,他已经变成了一只鸟:
  1. xiaoming.fly(); // 小明 is flying...
复制代码
在JavaScrip代码运行时期,你可以把
  1. xiaoming
复制代码
  1. Student
复制代码
变成
  1. Bird
复制代码
,或者变成任何对象。
请注意,上述代码仅用于演示目的。在编写JavaScript代码时,不要直接用
  1. obj.__proto__
复制代码
去改变一个对象的原型,并且,低版本的IE也无法使用
  1. __proto__
复制代码
  1. Object.create()
复制代码
方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有,因此,我们可以编写一个函数来创建
  1. xiaoming
复制代码
  1. // 原型对象:var Student = {    name: 'Robot',    height: 1.2,    run: function () {        console.log(this.name + ' is running...');    }};function createStudent(name) {    // 基于Student原型创建一个新对象:    var s = Object.create(Student);    // 初始化新对象:    s.name = name;    return s;}var xiaoming = createStudent('小明');xiaoming.run(); // 小明 is running...xiaoming.__proto__ === Student; // true
复制代码
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP