Lesson-7 JS原型

作者: 阿瑟李 | 来源:发表于2015-08-09 16:23 被阅读39次

JavaScript 语言是通过一种叫做 原型(prototype)的方式来实现面向对象编程的.
对象(object)则是依靠 构造器(constructor)利用 原型(prototype)构造出来的。
上面说的这一点很重要 需要细细思考 抛弃以前的的面向对象的固有模式。
在这里先说一下几个概念
构造函数什么,其实就是一个函数,但是在调用的时候使用new关键字,然后我们就可以获取一个新的对象了

function Student(name) {
    this.name = name;
    this.hello = function () {
        alert('Hello, ' + this.name + '!');
    }
}

使用构造函数创造的对象还会继承构造器(constructor)

xiaoming.constructor === Student.prototype.constructor; // true
Student.prototype.constructor === Student; // true

Object.getPrototypeOf(xiaoming) === Student.prototype; // true

xiaoming instanceof Student; // true

还有一点需要声明的是通过构造函数生成的对象是没有prototype属性的,而且构造函数中的属性其实是每一个对象单独拥有,但是如果说有一个函数都是一样的,那么我们可以直接设置构造函数的prototype,如下

function Student(name) {
    this.name = name;
}

Student.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
};

一般来说是放一些函数和静态值,也就是说不会改变的东西

上面说的这些其实只是简单的说了一下JS创造类的方法

那么我们如何实现继承呢

下面我先放一段别的地方粘贴过来的方法

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// 设置Bar的prototype属性为Foo的实例对象
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// 修正Bar.prototype.constructor为Bar本身
Bar.prototype.constructor = Bar;

var test = new Bar() // 创建Bar的一个新实例

// 原型链
test [Bar的实例]
    Bar.prototype [Foo的实例] 
        { foo: 'Hello World' }
        Foo.prototype
            {method: ...};
            Object.prototype
                {toString: ... /* etc. */};

这里面实现了简单的继承

在这里我需要先插一些题外话

这里先说一下 this 在函数中表示调用对象或者全局对象, 在构造函数中表示新对象,当然this对象也可能发生变换 比如我们使用 call或者apply就会直接绑定到第一个参数上面
所以

function PrimaryStudent(props) {
    // 调用Student构造函数,绑定this变量:
    Student.call(this, props);
    this.grade = props.grade || 1;
}

但是调用了构造函数不等于就已经继承了,我们还需要改变prototype属性

Nodejs 实现继承

Node提供了一种超级便利的继承工具 如下使用

var util = require("util");var events = require("events");function MyStream() { events.EventEmitter.call(this);}util.inherits(MyStream, events.EventEmitter);MyStream.prototype.write = function(data) { this.emit("data", data);}var stream = new MyStream();console.log(stream instanceof events.EventEmitter); // trueconsole.log(MyStream.super_ === events.EventEmitter); // truestream.on("data", function(data) { console.log('Received data: "' + data + '"');})stream.write("It works!"); // Received data: "It works!"

相关文章

  • Lesson-7 JS原型

    JavaScript 语言是通过一种叫做 原型(prototype)的方式来实现面向对象编程的.对象(object...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • 我的投稿

    js原型

  • JS原型

    最近一直在理解JS的原型------《你不知道的JS》--------《JS设计模式》 里面都讲JS的原型运作方式...

  • js基础(三)

    js基础 原型链和原型对象 ... ... js没有继承原型对象prototype通常用来添加公共的属性或行为且只...

  • 发现•分享—2019-01-17

    文章 JS JS 异步编程六种方案 JS基础—原型对象的那些事(一) JS基础—原型对象的那些事(二) CSS 综...

  • 前端资料

    ES6新数据类型 Symbol . js变量提升函数提升 js this js 原型及原型链理解 new做了什么 ...

  • javaScript中的面向对象思想之原型

    二、js的原型1、原型的概念原型是构造函数在js代码编译阶段,由系统为我们创建出来的一个对象;原型原型可以给系统构...

网友评论

    本文标题:Lesson-7 JS原型

    本文链接:https://www.haomeiwen.com/subject/levbqttx.html