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
+    }
+  })
+}

Reply via email to