http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/996bb893/html5/shared/freeze.js
----------------------------------------------------------------------
diff --git a/html5/shared/freeze.js b/html5/shared/freeze.js
index 44fb283..9c68da0 100644
--- a/html5/shared/freeze.js
+++ b/html5/shared/freeze.js
@@ -6,7 +6,8 @@ export function freezePrototype () {
Object.freeze(Object)
Object.freeze(Array)
- Object.freeze(Object.prototype)
+ // Object.freeze(Object.prototype)
+ freezeObjProto()
Object.freeze(Array.prototype)
Object.freeze(String.prototype)
Object.freeze(Number.prototype)
@@ -16,3 +17,46 @@ export function freezePrototype () {
Object.freeze(Date.prototype)
Object.freeze(RegExp.prototype)
}
+
+function freezeObjProto () {
+ freezeObjProtoProperty('__defineGetter__')
+ freezeObjProtoProperty('__defineSetter__')
+ freezeObjProtoProperty('__lookupGetter__')
+ freezeObjProtoProperty('__lookupSetter__')
+ freezeObjProtoProperty('constructor')
+ freezeObjProtoProperty('hasOwnProperty')
+ freezeObjProtoProperty('isPrototypeOf')
+ freezeObjProtoProperty('propertyIsEnumerable')
+ freezeObjProtoProperty('toLocaleString')
+ freezeObjProtoProperty('toString')
+ freezeObjProtoProperty('valueOf')
+ freezeObjProtoProperty('__proto__')
+ Object.seal(Object.prototype)
+}
+
+function freezeObjProtoProperty (propertyName) {
+ const proto = Object.prototype
+
+ if (!proto.hasOwnProperty(propertyName)) {
+ return
+ }
+
+ const origin = proto[propertyName]
+ Object.defineProperty(proto, propertyName, {
+ get: function () {
+ return origin
+ },
+ set: function (value) {
+ if (this === proto) {
+ throw Error(`Cannot assign to read only property ${propertyName} of
Object.prototype`)
+ }
+
+ Object.defineProperty(this, propertyName, {
+ value: value,
+ writable: true
+ })
+
+ return value
+ }
+ })
+}