你不知道的js-行为委托

lu0511 lu0511     2022-10-08     405

关键词:

1、面向委托的设计

2、委托理论

Task = {
    setID:function(ID) {this.id = ID;},
    outputID:function() {console.log(this.id)};
};
//让XYZ委托Task
XYZ = object.create(Task);

XYZ.prepareTask = function(ID,Label){
    this.setID(ID);
    this.label = Label;
}

XYZ.outputTaskDetails = function() {
    this.outputID();
    console.log(this.label);
}
//ABC = Object.create(Task);

 这段代码中,Task和XYZ并不是类(或者函数),它们是对象。XYZ通过Object.create()创建,它的[[Prototype]]委托了Task对象

相比于面向类(或者说面向对象),这种编码风格称为“对象关联”。我们真正关心的只是XYZ对象(和ABC对象)委托了Task对象

委托者(XYZ,ABC),委托目标(Task)

对象关联风格的代码有一些不同之处:

 1、id和label数据成员都是直接存储在XYZ上(而不是Task,)通常来说,在[[Prototype]]委托中最好把状态保存在委托者(XYZ,ABC)而不是委托目标(Task)上

2、在委托行为中,我们会尽量避免在[[Prototype]]链的不同级别中使用相同的命名

要求尽量少使用容易被重写的通用方法名,提倡使用更有描述性的方法名

委托行为意味着某些对象(XYZ)在找不到属性或者方法引用时会把这个请求委托给另一个对象(Task)

委托控件对象:

var Widget = {
    init: function(width,heeight){
        this.width = width || 50;
        this.height = height || 50;
        this.$elem = null
    },
    insert:function(){

    }
}
var Button = Object.create(Widget);
Button.setup = function(width,height,label){
    // 委托调用
    this.init(width,height);
    this.label = label || "default"
}
Button.build = function($where){
    this.insert();
}
Button.onClick = function(){

}
$(document).ready(function(){
    var $body = $(document.body);
    var btn1 = Object.create(Button);
    btn1.setup(125,30,"hello");
    btn1.build($body);
})

 

你不知道的js系列上(45)-显式混入(代码片段)

JS的对象机制并不会自动执行复制行为,由于其他语言中表现出来的复制行为,因此JS开发者也想出了一个方式来模拟类的复制行为,这个方法就是混入。我们先看第一种,显式混入。//非常简单的mixin()例子functionmixin(sourceObj,targe... 查看详情

读书笔记《你不知道的javascript(上卷)》——第二部分this和对象原型(代码片段)

文章目录第6章行为委托6.1面向委托的设计6.1.1类理论6.1.2委托理论1.互相委托(禁止)2.调试6.1.3比较思维模型6.2类与对象6.2.1控件“类”ES6的class语法糖6.2.2委托控件对象6.3更简洁的设计反类6.4更好的语法反词法6... 查看详情

你不知道的js-混合对象-类

1、类是一种设计模式,许多语言提供了对于面向类软件设计的原生语法,js中也有类似的语法,但是和其他语言中的类完全不同。2、类意味着复制3、js并不会像类那样自动创建对象的副本。4、在继承或者实例化时,js的对象机... 查看详情

《你不知道的js(中卷)》混合对象“类”(代码片段)

四、混合对象“类”:? 在研究类的具体机制之前,首先介绍面向类的设计模式:实例化(instantiation)、继承(inheritance)和(相对)多态(polymorphism)。一)、类理论:? 面向对象编程强调的是数据和操作数据的行为本质上是... 查看详情

你不知道的javascript——类型

一、ECMAScript语言中所有的值均有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Object。  我们这样来定义类型:对于语言引擎和开发人员来说,类型是值的内部特征,它定义了值的行为,以使... 查看详情

你不知道的js-对象

1、对象有两种形式定义:声明文字形式和构造形式。2、内置对象:js中有一些对象子类型,称为内置对象varstrprimitive=‘Iamstring‘;typeofstrprimitive;//‘string‘strprimitiveinstanceofString;//falsevarstrobj=newString(‘Iamstring‘);typeofstrobj;strobjinst... 查看详情

行为委托,简洁的对象关联编码风格

[b]前言[/b]这篇文章需要知道的一个重要观点,[[prototype]]机制就是指对象的一个内部链接引用另外一个对象。如果在第一个对象上没有找到需要的属性或者方法的引用,引擎就会继续在[[prototype]]关联的对象上继续查找,同理,如... 查看详情

《你不知道的js(中卷)》对象(代码片段)

三、对象:一)、语法:对象有两种形式定义:声明(文字)形式:varmyObj=key:value//...;构造形式:varmyObj=newObject();myObj.key=value;在声明形式中可以添加多个键/值对,但是在构造形式中必须逐个添加属性。1、类型:? 对象是JS的基... 查看详情

js随笔(你不知道的js)

    很多开发者不会深入思考程序出现和预期不一样的结果,只会回避并用其他方法来达到目的 一.闭包  无论通过何种方式将函数传递到词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个... 查看详情

你不知道的javascript之类型

...使经验丰富的开发人员也需要用心学习才能真正掌握。《你不知道的JavaScript》中是这样定义类型的:类型是值的内部特征,它定义了值的行为,以使其区别于其他值。这样的定义可能略简单了一些,不够已经足够让我们去理解... 查看详情

读书笔记-你不知道的js中-promise

继续填坑模式  考虑下面的代码:functionfn(x){//dosomethingreturnnewPromise(function(resolve,reject){//调用resolve(..)和reject(...)});}varp=fn(2);  newPromise(..)模式通常称为revealingconstructor。传入函数会立即执行(不会像then(..)中的回调一样异步延 查看详情

你不知道的js5-原型

1、原型[[prototype]]js中的对象有一个特殊的[[prototype]]内置属性,其实就是对于其他对象的引用,几乎所有的对象在创建时[[prototype]]属性都会被赋予一个非空的值使用for..in和in操作符都会查找对象的整条原型链所有普通的[[prototype]... 查看详情

你不知道的js系列(33)-对象复制(代码片段)

JS初学者最常见的问题之一就是如何复制一个对象。看起来应该有一个内置的copy()方法,实际上比想象中的更复杂,我们无法选择一个默认的复制算法functionanotherFunction()/**...*/;varanotherObject=c:true;varanotherArray=[];varmyObject=  a:2, ... 查看详情

《你不知道的js》提升(代码片段)

四、提升:一)、声明与赋值:? 在JS引擎中,我们一般认为的变量或函数声明,实际上分为两个部分。声明赋值//变量提升a=2;vara;console.log(a);//函数提升foo();functionfoo() console.log(1);? vara=2;? 这句声明实际上会被看为vara;a=2;两个部分... 查看详情

你不知道的js(代码片段)

作用域LHSRHS区别如果RHS查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出ReferenceError异常。值得注意的是,ReferenceError是非常重要的异常类型。相较之下,当引擎执行LHS查询时,如果在顶层(全局作用域)中也无法找到目标... 查看详情

js局部变量和全局变量·你不知道的事

...明就可以使用变量;第二,js有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。650)this.width=650;"src="https://s 查看详情

你不知道的js(代码片段)

1、作用域 块级作用域let只在函数内部自己的作用域内有效 全局作用域var 函数作用域 找不到作用域抛出ReferenceError变量有了则抛出TypeError 先声明后赋值 函数提升变量提升函数优先,函数声明提升在普通变量之前 函数表达... 查看详情

c#中的委托解析

...到“将方法作为方法的参数进行传递”,很多时候都只是知道简单的定义,主要是因为“委托”在理解上有较其他特性比较难的地方。在本次说明中,不会将委托的简单声明和调用作为重点。  “委托”不需要直接定义一... 查看详情