【翻译】Chrome 43 部份更新:如今 DOM 的属性将会在原型链上

翻译自DOM Attributes now on the prototype chain
不过文章中的有一些部份确切难以明白,假如有大神能看出我这里出错了,请实时的告诉我,感谢

Chrome团队近来宣告我们将DOM属性挪动到了原型链上。这个变化将会应用到在Chrome 43上。

这些新的行动将会在以下一个方面带来优点,以下:

  • 进步兼容性,IE和Firefox已遵照了范例
  • 许可你一向而且高效的在DOM对象上建立getter或setter
  • 能够进步顺序的hack的才能。比方,他许可你用一些兼容性东西,用来高效的模拟在一些浏览器上丧失的功用。而且javascript库也能够重写默许的DOM属性。

比方,假定W3C范例包含一些新的功用,叫做isSuperContentEditable,Chrome浏览器并没有采用它,然则它能够经由过程ployfill或许用一些库来模拟新的功用。作为一个库的开发人员,你能够天然的想去运用prototype去模拟新的功用。

js
Object.defineProperty(HTMLDivElement.prototype, "isSuperContentEditable", { get: function() { return true; }, set: function() { /* some logic to set it up */ }, });

在更新之前,为了保证chrome中和其他DOM元素属性的一致性,你不能不建立一个新的属性在每个实例上,这将会给页面中的每个HTMLDivElement加上谁人属性,这是非常低效的。

此次更新为了一致性、高性能和范例化的web平台来讲是非常重要的。但是你也能够提议一些issues给开发者。假如你信任这类由于这是chrome和webkit的遗产,我们勉励你去搜检一下你的网站,而且看一下以后的内容。

更新提要

如今运用hasOwnProperty在一个DOM元素大将会返回false

有时刻开发者就会运用hasOwnProperty去搜检是不是一个属性在一个对象上。如今将不会像之前的那样。由于DOM属性如今是原型链的一部份,而且hasOwnProperty仅仅搜检当前的对象是不是定义了它。

在Chrome 42 中下面将会返回true

js
> div = document.createElement("div"); > div.hasOwnProperty("isContentEditable"); true

在Chrome 43中前面的将会返回false


> div = document.createElement("div"); > div.hasOwnProperty("isContentEditable"); false

这个如今意义着假如你想要搜检isContentEditable是不是在元素上可用,你须要搜检html元素对象的原型上。
假定,HTMLDivElement继承自HTMLElement。而且HTMLElement定义了isContentEditable属性

js
> HTMLElement.prototype.hasOwnProperty("isContentEditable"); true

你没必要一定要运用hasOwnProperty。我们引荐去运用非常简朴的in操纵符。就像下面这个代码去搜检是不是一个属性在全部原型链中存在。

js
if("isContentEditable" in div) { // We have support!! }

Object.getOwnPropertyDescript在DOM实例大将不再返回对这个属性的形貌

假如你的网站须要取得属性的形貌符在一个DOM对象上,你如今须要在原型链上举行操纵。
假如你想要取得属性的形貌符在Chrome 42 或许更早,你能够如许做


> Object.getOwnPropertyDescriptor(div, "isContentEditable"); Object {value: "", writable: true, enumerable: true, configurable: true}

在Chrome 43中将会返回 undefined 在这断代码中


> Object.getOwnPropertyDescriptor(div, "isContentEditable"); undefined

这将意味着,想要取得属性的形貌符,你须要在原型链上举行操纵,以下:


> Object.getOwnPropertyDescriptor(HTMLElement.prototype, "isContentEditable"); Object {get: function, set: function, enumerable: false, configurable: false}

JSON.stringify 将不再序列化DOM属性

JSON.stringify 不会序列化DOM在原型上的属性。
比方,这个将会影响你的网站假如你尝试去序列化一个推送提示对象 PushSubscription

Chrome 43 或许更早的版本,将会根据下面的效果返回


> JSON.stringify(subscription); { "endpoint": "https://something", "subscriptionId": "SomeID" }

Chrome 43 根据上面的代码将不会序列化定义在原型链上的属性,而且返回一个空的对象


> JSON.stringify(subscription); {}

你将要不能不供应本身的格式化要领,比方,你能够如许弄:


function stringifyDOMObject(object) { function deepCopy(src) { if (typeof src != "object") return src; var dst = Array.isArray(src) ? [] : {}; for (var property in src) { dst[property] = deepCopy(src[property]); } return dst; } return JSON.stringify(deepCopy(object)); } var s = stringifyDOMObject(domObject);

在严厉形式下,修正只读属性将会抛出毛病

当你运用严厉形式的时刻,修正只读属性将会抛出一个毛病。
比方:


function foo() { "use strict"; var d = document.createElement("div"); console.log(d.isContentEditable); d.isContentEditable = 1; console.log(d.isContentEditable); }

Chrome 43 或许更早版本,函数将会继承的实行,而且不会抛出任何非常,只管isContentEditable 并不会转变。


// Chrome 42 and earlier behavior > foo(); false // isContentEditable false // isContentEditable (after writing to read-only property)

如今在Chrome 43 中将会抛出一个非常。


// Chrome 43 and onwards behavior > foo(); false Uncaught TypeError: Cannot set property isContentEditable of #<HTMLElement> which has only a getter

Chrome 43 关于DOM的更新就到这里完毕了,假如人人对我翻译的这篇文章假如有任何疑问,迎接提意见。

    原文作者:XGHeaven
    原文地址: https://segmentfault.com/a/1190000002784785
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞