JavaScript原型编程

一开始接触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);
//添加子视图

代码变得清晰多了

博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,827评论 2 17
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 3,023评论 4 14
  • 她给我很多幻想,也能让我绝望。她给我很多方向,同时也让我彷徨。她应该是我人生中最纠结的一部分。 她是一只没有翅膀的...
    烂人張c阅读 405评论 1 5
  • 又是一年冬至。郑州被雾霾笼罩。 大一那年,冬至,新的朋友,新的环境,很开心。 还记得那个冬至,一个晚上吃了四摊,从...
    阿沐打阅读 511评论 0 0