`
yiminghe
  • 浏览: 1460140 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

再谈 attribute

阅读更多

@slideshare

 

 

原生:


attribute 的访问控制从ecmascript3.1开始引入,在ecma5正式成为标准,目前有ie8与chrome支持,使用方式:

 

foo={};
Object.defineProperty(foo, "test", 
{ 
getter: function() { return "foo" } ,
setter: function(v){this.test=v;}
}
);
alert(foo.test);

 

那么在每次读取foo的test属性时,都会调用其相应description部分的getter和setter函数。


而早在javascript1.5,firefox通过新语法实现了对应的功能,目前除了ie之外的浏览器都支持这种语法:

 

var lost = {
	loc : "Island",
	get location () {
		return this.loc;
	},
	set location(val) {
		this.loc = val;
	}
};
lost.location = "Another island";

 

通过属性支持,可以产生很多写代码的新方式,确切的说对于类库编写者可以更好的处理兼容性问题,使得接口通过属性暴露更加直观明了,参见 ajaxian 的讨论部分

 

1.children  模拟在firefox,遍历childNodes取元素节点。

2.outHTML 模拟在firefox ,创建临时div包裹,再取innerHTML。


模拟:


YUI3 为了跨浏览器的最大兼容性通过attribute模块实现了对应的功能,并添加属性事件变化触发机制,大大增加了属性机制的实用性。简单的说 yui3的属性机制约束用户调用指定的接口通过自定义事件以及自身维护的内部属性信息使调用者可以摆脱达到类似功能需要写的程式化模板代码。


这里自己模拟实现一下yui3的属性处理:


simplified attribute


关键在于控制 get,set 的调用,触发相关事件,设置内部属性。



使用:


前文 yui3 例子的加强版规定范围的累加框

 

例子图解:

 

组件部分:


通过after属性事件来同步业务数据同 ui 状态,setter 以及 before 属性事件来验证修正输入:

 

AttributeIncreaser.ATTRS = {
        "v": {
            /*
        			初始值取得,取得后该属性删除,添加默认值value=valueFn()
        		*/
            valueFn: function () {
                return this.input.val();
            },
            //domain业务逻辑
            setter: function (v) {
                if (v == this._edge) return this.get("min");
            }
        },
        max: {
            value: "3"
        },
        min: {
            value: "0"
        }
    };
    /*
			note : cfg should be first argument.
		*/
    function AttributeIncreaser(cfg, domInput, domAction) {
        var self = this;
        AttributeIncreaser.superclass.constructor.apply(this, arguments);
        this.input = domInput;
        this.domAction = domAction;
        this._edge = parseInt(this.get("max")) + 1 + "";
        //domain业务逻辑
        this.domAction.on("click", function (e) {
            self.increase(e);
        });
        //利用after事件触发实现属性与gui同步,属性首字母大小,after/before + Attribute + Change
        this.on("afterVChange", function () {
            self.afterVChange.apply(self, arguments);
        });
        //dimain业务逻辑,利用before事件触发,阻止非规范值输入
        this.on("beforeVChange", function (e) {
            if (parseInt(e.newVal) > parseInt(self._edge)) {
                alert("invalid input,refuse");
                return false;
            }
        });
    }
    S.extend(AttributeIncreaser, S.Base, {
        increase: function () {
            this.set("v", parseInt(this.get("v")) + 1);
        },
        afterVChange: function (e) {
            this.input.val(e.newVal);
        }
    });
 

好处:

 

1.由于浏览器dom engine同javascript engine的分离设计,通过复制dom属性到javascript属性尽可能少得 touch dom,减少js同dom间的通信提高效率。


2.组件开发者不需要自己显式在构造器中动态建立对应dom的js属性,不需要显式定义相关状态事件


3.使用attribute更适合多状态组件(对比多行为组件)


4.组件开发者后期修改程序更加方便,某个属性变化的处理函数可以通过事件触发调用而放在
分离 合适 位置


 

KISSY 实现 Attribute

 

1. 实例内部维护属性值 map。
2. augment 自 KISSY.EventTarget
3.set,get 调用相关setter ,getter
4.set 前后触发自定义事件
5.new 时
1.根据继承构造器沿链初始化:为了读写效率属性 meta information从构造器链深度复制到实例。
2.将用户值添加到实例属性值map


注意:

1.prevent conflict attribute name in constructor chain
2.事件在初始化 new XX(cfg) 时并不会触发,new 时参数出错对象也就没有意义了,请在new 之前程序员自己保证正确。

 

 

 

调用部分:

 

var attrIn = new AttributeIncreaser({
          //属性值设置,覆盖默认值
          max: 3
    },
    S.one("#v"), S.one("#r"));
   
    //通过输入框设置组件状态部分代码
    var v2 = S.one("#v2");
    var r2 = S.one("#r2");

    //设置组件属性,通知组件更新自己的状态
    r2.on("click", function () {
        attrIn.set("v", v2.val());
    });
     
    //监听属性状态变化,同步外部数据
    attrIn.on("afterVChange", function () {
        v2.val(attrIn.get("v"));
    });
    
    //全部重置部分代码
    var r3 = S.one("#r3");
    r3.on("click", function () {
        attrIn.reset();
    });

 

好处:

 

组件使用者,可以使用属性直观得和组件交互,同组件完全解耦分离,且组件开发者和使用者通过监控同一属性变化又达到了一定的统一协作。

 

代价:


1.任何多余的继承抽象都会带来的相同问题:code float,attribute的基础代码 yui compressor 1.4k

2.引入自定义事件间接层带来的监听器触发,比原来多了一次函数调用

 

 

参考阅读:

 

YUI3 Attribute

 

复杂的attribute应用:游戏编写中的属性管理


ecma5的新增feature介绍


firefox的属性使用


属性在浏览器间的差异总结


javascript的近年变化总结


jquery作者关于gettter,settter的简单介绍


其他使用介绍 1     ,    2

 

 

 

  • 大小: 18.4 KB
分享到:
评论

相关推荐

    浅谈js中的attributes和Attribute的用法与区别

    一:Attribute的几种用法和含义(attributes和Attribute都是用来操作属性的) getAttribute:获取某一个属性的值; setAttribute:建立一个属性,并同时给属性捆绑一个值; createAttribute:仅建立一个属性; ...

    浅谈matplotlib中FigureCanvasXAgg的用法

    背景知识: ...报错信息’FigureCanvasQTAgg’ object has no attribute ‘manager’ 将一个navigation toolbar渲染成Qt widgets 使用用户事件来实时更新matplotlib plot matplotlib针对GUI设计了两层结构

    浅谈Tensorflow由于版本问题出现的几种错误及解决方法

    一、AttributeError: 'module' object has no attribute 'rnn_cell' 这个错误通常是由于Tensorflow的新版本中,原有的`tf.nn.rnn_cell`被弃用,转而推荐使用`tf.contrib.rnn`。解决这个问题的方法是将代码中所有的`...

    浅谈keras通过model.fit_generator训练模型(节省内存)

    ### Keras中使用`model.fit_generator`训练模型详解 #### 前言 在机器学习领域,特别是深度学习中,模型训练过程中经常会遇到的一个问题是内存溢出。这主要是因为随着数据集规模的增长以及输入特征维度的增加,所...

    小谈 IMX28系列开发板linux初始化Timer过程

    #define MACHINE_START(_type,_name) __attribute__ machine_desc .arch.info.init 标号 多寄存器加载存储指令 do_initcalls

    浅谈javascript中的DOM方法

    1:获取对象的三种方法  1)document.getElementById(id);... 1)object.getAttribute(attribute);获取元素的属性.===>>>HTMLDOM: object.attribute;  2)object.setAttribute(attribute,value);设置元素的属性.==

    浅谈户外广告.docx

    These problems can be attributed to randomness, commercialization, and low-level development. To address these challenges, proper planning and management are crucial, ensuring forward-looking ...

    structs入门经验谈

    ### Struts 入门经验谈 #### 概述 本文旨在为初学者提供关于 Struts 的入门级指导,尤其适用于 J2EE 开发者。Struts 是一款基于 Model-View-Controller (MVC) 设计模式的开源框架,用于简化 Java Web 应用程序的...

    试谈MINITAB的常规操作.pptx

    - **属性数据测量系统分析 (Attribute Gage R&R Study)**:适用于非连续(例如,是/否,合格/不合格)数据的测量系统评估。此研究关注的是检验员在多次检查同一样品时的一致性。输出结果包括再現性百分比、一致性的...

    浅谈keras中的keras.utils.to_categorical用法

    在深度学习领域,Keras 是一个非常流行的高级神经网络 API,它构建在 TensorFlow、Theano 和 CNTK 之上。Keras 提供了一系列方便的工具和函数,使得模型构建、训练和评估变得更加简单。其中,`keras.utils.to_...

    浅谈pyqt5在QMainWindow中布局的问题

    为了在QMainWindow中使用布局,我们需要创建一个QWidget对象作为中央部件,并将布局应用于这个部件,然后再将这个部件设置为QMainWindow的中央部件。以下是实现这一过程的步骤: 1. 创建一个QWidget实例,这将是...

    浅谈python中截取字符函数strip,lstrip,rstrip

    在Python编程语言中,`strip()`, `lstrip()`, 和 `rstrip()` 是三个非常实用的字符串处理函数,主要用于从字符串的两端移除特定字符或空格。它们都是字符串对象的内置方法,使得处理字符串边缘的字符变得简单而高效...

    浅谈在Auto CAD下如何能提高绘图速度.pdf

    块(Block)和属性(Attribute)的使用也是加快绘图速度的重要技术。块是AutoCAD中的一种实体,可以将多个对象组合成一个单一的对象,便于管理和重复使用。通过为块添加属性,可以存储关于对象的信息,如零件号、...

    浅谈应用CAD环境下点、线、面命令制作地形图图例的方法.pdf

    如果这个点符号需要包含额外的信息,如高程或地址,那么可以创建一个带属性的块(Attribute block)。带属性的块在插入图形时可以要求用户输入属性信息,例如桩号和高程。 线符号通常表示连续的线性特征,如道路、...

    解决DataFrame排序sort的问题

    AttributeError: 'DataFrame' object has no attribute 'sort' 解决方式: sort_values()即可解决 以上这篇解决DataFrame排序sort的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多...

    浅谈python中的getattr函数 hasattr函数

    3. **代码扩展性**:当不确定对象是否有某个属性或方法时,使用`hasattr`检查后再使用`getattr`可以避免程序崩溃。 ##### 示例代码(基于反射机制) ```python def run(): while True: cs = input('请输入要访问...

Global site tag (gtag.js) - Google Analytics