JavaScript原型编程

作者: 贱贱贱贱贱 | 来源:发表于2016-06-27 00:02 被阅读192次

一开始接触JavaScript的时候了解这是一门面向对象的语言,通过面向对象的方式构建了下面的代码

var View = function () {
  this.height = 0;
  this.width = 0;
  this.background = '白色';
  this.childs = [];
}
View.prototype.addChild = function (view) {
  this.childs.push(view);
  console.log('添加子视图');
}

var ButtonView = function() {
  View.call(this);
}
ButtonView.prototype = Object.create(View.prototype);
ButtonView.prototype.onclik = function () {
  console.log('点击了');
};

var button = new ButtonView();
button.onclik();
//点击了
var button2 = new ButtonView();
button.addChild(button2);
//添加子视图

后来正式系统的学了JavaScript才知道这语言和其他面向对象的语言是不同的,JavaScript是没有类和继承的概念的,能够不依靠类,构造出对象,上面代码是依靠prototype模仿了类和继承。
JavaScript 可以通过构造函数来创建对象, * 构造函数是要 new+一个函数 才是构造函数 *

var button = new ButtonView();

上面生成button对象分成四个步骤

  • 创建一个空对象var o = {};
  • 将空对象的prototype赋值o.prototype = ButtonView.prototype;
  • 将函数的this指向0执行函数 * 在JavaScript函数中如果没有return 默认就是 return undefined 在构造函数中如果return的不是一个引用类型的将return this *
  • button = 函数返回的对象

这就是构造函数的大致过程,然后我要讲的就是第二步中的prototype

prototype是对象内置的一种属性,是一种对其他对象的引用属性,button.background操作的时候,首先对button对象进行检查是否有该属性,如果没有的话则会通过prototype访问委托对象,如果有原型对象有background属性则返回,没有则继续委托该原型的prototype直到Object.prototype,这样就形成了一条原型链。

如果对my进行set操作,比如button.background = '黑色',将会分成三种情况。

  • 一般情况prototype.background是可读写那么会直接在button对象赋值,这样访问background属性的时候因为button对象已经有了该属性,button.prototype
  • 如果prototype.background只读,那么将无法设置background
  • 如果prototype.backgroundSet方法那将直接执行set方法,无视上面两种情况

在写JavaScript代码的时候,我们应该抛开以前学习用类来设计的方法,虽然JavaScript可以模拟,但是不是最适合的,写起来总觉得别扭。JavaScript更适合通过委托的方式在编写。比如在一开始写的代码,改成通过委托对象的思维变换成下面代码

var View ={
  height: 0,
  width: 0,
  background: '白色',
  childs: [],
  addChild: function (view) {
    this.childs.push(view);
    console.log('添加子视图');
  }
}

var ButtonView = Object.create(View);
ButtonView.onclik = function () {
  console.log('点击了');
};

var button = Object.create(ButtonView);
button.onclik();
//点击了
var button2 = Object.create(ButtonView);
button.addChild(button2);
//添加子视图

代码变得清晰多了

博客地址

相关文章

  • Javascript 基于原型的面向对象系统编程

    Javascript是使用克隆的原型模式。 1. 原型编程的规则 所有的数据都是对象(javascript中不是所...

  • JavaScript原型编程

    一开始接触JavaScript的时候了解这是一门面向对象的语言,通过面向对象的方式构建了下面的代码 后来正式系统的...

  • JavaScript学习笔记3—面向对象编程

    JavaScript—面向对象编程 JavaScript不区分类和实例的概念,而是通过原型(prototype)来...

  • ajax

    1. 面向对象 javascript 具有面向过程,面向对象,函数式编程的特点 javascript 重要 原型/...

  • 原型、构造函数与面向对象编程

    1. 复杂的原型链 原型是 JavaScript 向面向对象编程语言进化的产物。 为什么要面向对象编程?为了代码复...

  • JavaScript prototype原型对象

    JavaScript是一门面向对象的编程语言,与其它面向编程的语言不同的是,JavaScript的面向是基于原型的...

  • 构造函数和原型对象

    javascript使用构造函数和原型对象来进行面向对象编程 构造函数 在 JavaScript 中,构造器其实就...

  • JavaScript的诞生

    JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、函数先行...

  • JavaScript 中的面向对象与原型

    layout: posttitle: JavaScript 中的面向对象和原型tag: 编程语言 创建一个对象,新...

  • 面向对象编程

    JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。 xiaoMing...

网友评论

    本文标题:JavaScript原型编程

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