Webkit的自定义属性获取函数以及属性删除函数实现

概述: [CustomEnumerateProperty] 当给定的接口被枚举时,允许你为指定接口的属性获取函数编写自己的实现. 同样,当接口的属性被删除时,[CustomDeleteProperty]允许你编写自己的实现.

customEnumerateProperty](i), [CustomDeleteProperty](i)

用法: 这两个修饰可作用在interface,用法如下:

    [
        CustomEnumerateProperty,
        CustomDeleteProperty
    ] interface DataTransferItemList {
    };
  • [CustomEnumerateProperty] in JavaScriptCore:
    你能编写DataTransferItemList的属性获取函数,具体来说,你可以编写这个函数JSXXX::getOwnPropertyNames(...), 它来自于WebCore/bindings/js/JSDataTransferItemListCustom.cpp:
 void JSDataTransferItemList::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
{
    JSDataTransferItemList* thisObject = jsCast<JSDataTransferItemList*>(object);
    ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info);
    for (unsigned i = 0; i < static_cast<DataTransferItemList*>(thisObject->impl())->length(); ++i)
        propertyNames.add(Identifier::from(exec, i));
     Base::getOwnPropertyNames(thisObject, exec, propertyNames, mode);
}
    [

        CustomDeleteProperty
    ] interface Storage {
    };
  • [CustomDeleteProperty] : 当Storage的属性被删除时,我们可以编写自己的属性删除函数,具体点说,就是像这样子编写JSStorage::deleteProperty(...) 函数,它位于WebCore/bindings/js/JSStorageCustom.cpp:
bool JSStorage::deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName)
{
    JSStorage* thisObject = jsCast<JSStorage*>(cell);
    // Only perform the custom delete if the object doesn‘t have a native property by this name.
    // Since hasProperty() would end up calling canGetItemsForName() and be fooled, we need to check
    // the native property slots manually.
    PropertySlot slot;
    if (getStaticValueSlot<JSStorage, Base>(exec, s_info.propHashTable(exec), thisObject, propertyName, slot))
        return false;
        
    JSValue prototype = thisObject->prototype();
    if (prototype.isObject() && asObject(prototype)->hasProperty(exec, propertyName))
        return false;

    thisObject->m_impl->removeItem(propertyNameToString(propertyName));
    return true;
}

参考:

1 http://trac.webkit.org/wiki/WebKitIDL#CustomEnumerateProperty

2 souce code of webkit

时间: 2024-10-13 00:42:36

Webkit的自定义属性获取函数以及属性删除函数实现的相关文章

JavaScript函数内部属性和函数方法

函数是对象,有自己的属性和方法 .首先通过console下输出的函数属性方法来直观的看一下: 函数内部属性只要包括两个特殊的对象:arguments和this. 函数属性包括:length和prototype 函数方法(非继承)包括:apply()和call() 继承而来的函数方法:bind().toString().toLocaleString().valueOf() 其他的目前不熟,后面再补充 1. 函数内部属性 在函数内部,有两个特殊的对象,arguments和this. argument

jQuery学习- 获取与设置属性的函数

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>属性访问与设置</title> <script src="js/jquery.js"></script> <style> .astyle{ border: 1px solid red;} </style> <script t

Javascript高级程序设计——函数内部属性与函数属性

函数内部属性 函数内部有两个特殊的属性arguments和this.其中,arguments是类数组对象,包含传入函数中的所有值,这个arguments还有一个属性:callee,这个属性是一个指针,指向拥有arguments的函数.而this据以引用的是函数执行环境对象. function fib(n){ if(n = 1){ return 1; }else{ return n * arguments.callee(n - 1); } } //这里利用函数内arguments的callees属

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

jQuery -&gt; 获取/设置/删除DOM元素的属性

Sum square difference Problem 6 The sum of the squares of the first ten natural numbers is, 12 + 22 + ... + 102 = 385 The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)2 = 552 = 3025 Hence the difference between the sum of

Python帮助函数调试函数 用于获取对象的属性及属性值

刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详细有什么属性,包括什么值,所以写了一个函数.用于获取对象的属性及属性值 函数代码例如以下: #调试函数.用于输出对象的属性及属性值 def getAllAttrs(obj): strAttrs = '' for o in dir(obj): strAttrs =strAttrs + o + ' := ' + str(getattr(obj,o)) + '<br

jQuery -&amp;gt; 获取/设置/删除DOM元素的属性

jQuery的属性操作很easy,以下以一个a元素来说明属性的获取/设置/删除操作 <body> <a>jquery.com</a> </body> 加入?属性 $('a').attr('href', 'http://www.jquery.com') 加入?多个属性 $('a').attr({'href':'http://www.jquery.com', 'title':'jquery.com'}) 获取属性 $('a').attr('href') clas

关于JS(原生js+jq)中获取、设置或者删除元素属性和获取元素值

一.JS获取.设置或者删除元素属性 原生js: $("要获取属性class/id名").getAttribute("属性"); $("要设置属性class/id名").setAttribute("属性","属性值"); $("要删除属性class/id名").removeAttribute("属性"); jq: $("要获取属性class/id名"

Python 获取对象的属性和方法—dir 函数

工作中,我们使用一些之前没用到过的模块,使用时需要了解一下这个模块中的一些类的方法或属性,怎么做呢?目前我比较常用的两款IDE“Pycharm”和“VSCode”,都可以通过先导包,然后通过“Ctrl+鼠标左键”,进入源码后观看并膜拜一下大神们的代码,当然也可以进入我们在项目中自己所定义的,然后进行快速修改,真的是很方便呢.但是有的时候,我们使用的环境没有这类的IDE,那该怎么学习我们要用的这些类方法和属性呢?方法当然很多,无论是小白,还是大神,百度谷歌大法都是比较快速和方便的.但是对于一些刚开