javascript-代码复用模式

代码复用模式

1)使用原型继承

函数对象中自身声明的方法和属性与prototype声名的对象有什么不同:

自身声明的方法和属性是静态的, 也就是说你在声明后,试图再去增加新的方法或者修改已有的方法,

并不会由其创建的对象产生影响,也即继承失败。

而prototype可以动态地增加新的方法或者修改已有的方法, 从而是动态的,一旦父函数对象声明了相关的prototype属性,由其创建的对象会自动继承这些prototype的属性。

既然有函数对象本身的属性, 也有prototype的属性, 那么是由其创建的对象是如何搜索相应的属性的呢?

基本是按照下面的流程和顺序来进行:

1 先去搜索函数对象本身的属性,如果找到立即执行

2 如果1没有找到,则会去搜索prototype属性,有2种结果,找到则直接执行,否则继续搜索父对象的父对象的prototype,

直至找到,或者到达prototype chain 的结尾(结尾会是Object对象)

上面也回答如果函数对象本身的属性与prototype属性相同(重名)时的解决方式, 函数本身的对象优先。

实例:

Js代码  

  1. function Employee(name)
  2. {
  3. this.name = "";
  4. this.dept = "general";
  5. this.gender = "unknown";
  6. }
  7. function WorkerBee()
  8. {
  9. this.projects = [];
  10. this.hasCar = false;
  11. }
  12. WorkerBee.prototype = new Employee; // 第一层prototype链
  13. function Engineer()
  14. {
  15. this.dept = "engineer"; //覆盖了 "父对象"
  16. this.language = "javascript";
  17. }
  18. Engineer.prototype = new WorkerBee; // 第二层prototype链
  19. var jay = new Engineer("Jay");
  20. if (flag)
  21. {
  22. alert(jay.dept); //engineer, 找到的是自己的属性
  23. alert(jay.hasCar); // false, 搜索到的是自己上一层的属性
  24. alert(jay.gender); // unknown, 搜索到的是自己上二层的属性
  25. }

2)使用Object.create继承对象

ECMAScript5也提供了类似的一个方法叫做Object.create用于继承对象。

实例:

Js代码  

  1. var parent = {
  2. name : "张三"
  3. };
  4. /* 使用新版的ECMAScript 5提供的功能 */
  5. var child = Object.create(parent, {
  6. age : {
  7. value : 2
  8. },
  9. sex : {
  10. value : ‘男‘
  11. }
  12. });
  13. console.log("child.age.value: " + child.age + "-----sex: " + child.sex);
  14. //child.age.value: 2-----sex: 男

3)使用Object.defineProperty(可以更细粒度的对新增的属性进行配置设置)

语法:

Object.defineProperty(obj, prop, descriptor)

参数:

obj:目标对象

prop:需要定义的属性或方法的名字。

descriptor:目标属性所拥有的特性。

可供定义的特性列表:

value:属性的值

writable:如果为false,属性的值就不能被重写。

get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。

set:一旦目标属性被赋值,就会调回此方法。

configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable,   configurable, enumerable)的行为将被无效化。

enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。

实例:

Js代码  

  1. var foo = {x:10};
  2. Object.defineProperty(foo, "y", {
  3. value:20,
  4. writable: false,//只读
  5. configurable: false, //不可配置
  6. enumerable: true
  7. });
  8. console.log(foo.y); //20

4)通过call或apply方法

方法定义

call方法:

语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply([thisObj[,argArray]])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

说明:call, apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments

实例:

Js代码  

  1. function Animal(name){
  2. this.name = name;
  3. this.showName = function(){
  4. alert(this.name);
  5. }
  6. }
  7. function Cat(name){
  8. Animal.call(this, name);
  9. }
  10. var cat = new Cat("Black Cat");
  11. cat.showName(); //Black Cat
  12. //Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了
  13. //此时Cat对象就能够直接调用Animal的方法以及属性了.
时间: 2024-10-24 10:03:42

javascript-代码复用模式的相关文章

javascript代码复用模式(二)

前面说到,javascript的代码复用模式,可分为类式继承和非类式继承(现代继承).这篇就继续类式继承. 类式继承模式-借用构造函数 使用借用构造函数的方法,可以从子构造函数得到父构造函数传任意数量的参数.这个模式借用了父构造函数,它传递子对象以绑定到this,并转发任意数量的参数: function Child(a,b,c,d){ Parent.apply(this,arguments); } 在这种方式中,只能继承在父构造函数中添加到this的属性,并不能继承添加到原型中的成员. 使用借用

javascript代码复用模式

原文链接:http://www.faceye.net/search/143351.html 代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构造函数,可以使用new创建对象,并且可以动态的修改对象.javascript的非类式继承(可称为现代继承模式)复用方法也很多,例如,利用其它对象组合成所需要的对象,对象混入技术,借用和复用所需要的方法. 类式继承模式-默认模式

javascript代码复用模式(三)

前面谈到了javascript的类式继承.这篇继续部分类式继承,及一些现代继承. 类式继承模式-代理构造函数 这种模式通过断开父对象与子对象之间原型之间的直接链接关系,来解决上次说到的共享一个原型所带来的问题,而且同时可以继续原型链带来的好处. 代码: function inherit(C,P){ var F = function(){}; F.prototype = P.prototype; C.prototype = new F(); } 可以看到,在这里面有一个空构造函数F(),充当了子对

深入理解JavaScript系列(46):代码复用模式(推荐篇)

介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { function F() { } F.prototype = o; return new F(); } // 要继承的父对象 var parent = { name: "Papa" }; // 新对象 var child = object(parent); // 测试 console.log(c

深入理解JavaScript系列(45):代码复用模式(避免篇)

介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少有带来一些问题:第二排是推荐篇,指的是推荐大家使用的模式,一般不会有什么问题. 模式1:默认模式 代码复用大家常用的默认模式,往往是有问题的,该模式使用Parent()的构造函数创建一个对象,并且将该对象赋值给Child()的原型.我们看一下代码: function i

JavaScript模式读书笔记 第6章 代码复用模式

主要使用代码继承来完成复用. 1,使用类式继承. -1,类式继承:按照类的方式来实现继承,即所谓的类式. -2,类式继承:通过构造函数(child)获取来自parent的属性,从而创建对象. <script> //parent function Parent(name){ this.name = name || 'Adam'; } Parent.prototype.say = function(){   return this.name; } //child function Child(na

javascript代码复用(四)-混入、借用方法和绑定

这篇继续说js的现代复用模式:混入.借用方法和绑定. 混入 可以针对前面提到的通过属性复制实现代码复用的想法进行一个扩展,就是混入(mix-in).混入并不是复制一个完整的对象,而是从多个对象中复制出任意的成员并将这些成员组合成一个新的对象. 混入的实现并不难,只需要遍历每个参数,并且复制出传递给这个函数的每个对象中的每个属性. function mix(){ var arg,prop,child={}; for(arg=0:arg<arguments.length;arg++){ for(ar

Atitit 代码复用的理解attilax总结

1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 1.1.4. 模式4:借用方法1 1.2. 组合2 1.3. API提供了一种代码复用的机制.2 1.4. 类库机制2 1.5. Include import2 1.6. Cfg2 1.7. 良好的复用和不良的复用2 1.8. 可复用组件的 5 种类型  代码块 Code Block算法 模式   数据类型 库3 1.9. 2. 算法 Algo

【转】使用Jasob混淆javascript代码

在平常的web开发中,我们时常需要写一些js的类库,当我们发布自己产品的时候,不得不把源代码分发出去:但是这样就会泄露自己的代码.今天使用了一下Jasob感觉不错: 使用Jasob,我们的JavaScript代码无法被任何人理解从而杜绝剽窃和泄密,别人再也不能在我们的代码上做点修改就成了他的作品了.使用Jasob混淆以后,JavaScript的代码大小将缩小为原来的30%,因此浏览器将用更短的时间下载并执行网页代码. Jasob分析JavaScript的代码并替换掉描述性的变量和函数名称,例如客