- 认识框架
- 认识原型和实例
var a = {} // 实例 var b = class b{} // 实例 var c = new (function(){}) 实例 var d = Object() // 实例 var e = Object.create({}) // 实例 function xx(){} // 方法也是对象 方法即是实例也是对象 /* 实例调用 __proto__ 返回实例的原型 原型调用 __proto__ 返回父亲的原型/实例 原型 调用 prototype 返回原型自身 window.__proto__ === Window.prototype // true ({}).__proto__ */
只要有__proto__ 的就是实例
那有没有没有这个的呢?
函数实际上就是对象,每个函数都是Function类型的实例,由于函数是对象,因此函数名也是指向函数对象的一个指针,并不会和函数绑定.
举个例子
function WindowProperties(){} var window1 = function Window1(){} Object.defineProperties(Window1, { [Symbol.toStringTag]: { value: "Window1", configurable: true } }) window1 = new Window1(); var WindowProperties1 = function WindowProperties1(){} Object.defineProperties(WindowProperties1, { [Symbol.toStringTag]: { value: "WindowProperties1", configurable: true } }) // 如何取window1的原型? window1.__proto__ = WindowProperties;
要伪造window1和window一样
如何实现呢?
var window1 = function Window1(){} window1 = new Window1; Object.defineProperties(Window1.prototype, { [Symbol.toStringTag]: { value: "Window", configurable: true } }) var WindowProperties1 = function WindowProperties1(){}; Object.defineProperties(WindowProperties1.prototype, { [Symbol.toStringTag]: { value: "WindowProperties1", configurable: true } }) //window1.__proto__ == Window1.prototype true window1.__proto__.__proto__=WindowProperties1.prototype // 接着补EventTarget var EventTarget1 = function EventTarget1(){}; Object.defineProperties(EventTarget1.prototype, { [Symbol.toStringTag]: { value: "EventTarget1", configurable: true } }) WindowProperties1.prototype.__proto__ = EventTarget1.prototype
修改成这个样子就行了
还需要删除掉构造函数 这个constructor