因为平时做js逆向的时候会经常碰到实例对象以及原型对象中种种问题,在这里做一个简单的记录,比较通俗易懂,有不对的地方可以及时指正。
// people是一个实例对象
var people = {
name:'human',
age:'28',
f:function(){
console.log(this)
}
};
// 任意一个方法都可作为构造方法
function handsome_man(){
console.log("帅哥这里集合!")
}
handsome_man.b = "3" // 实例对象不可继承
handsome_man.prototype.a = "2" // 实例对象可以继承
handsome_man.prototype.get_wife = function(name){
console.log("你的老婆是:",name)
}
var zhangsan = new handsome_man()
// 实例对象没有 prototype,因为prototype是为了被继承,但是实例对象不可再创建实例被继承
// 所以在逆向过程中,不清楚是实例对象还是原型对象,可以直接在控制台输出下是否有prototype这个属性
// 也可以输出一下对象的__proto__
// 实例对象.__proto__输出的是个对象,而原型对象.__proto__输出的是一个方法
//例 : handsome_man.__proto__ 输出的是 funciton(){[ native code ]}
// 实例对象.属性 = 实例对象.__proto__.属性 = 原型对象.prototype.属性
// 但是如果我们直接打印 实例对象 的时候,通过 原型对象.prototype.属性 这样添加的属性不会被打印出来
// 换言之,zhangsan确实是有weight 和 age 两个属性,但是age是通过继承原型获得的属性
// 所以单打印 zhangsan 的时候,只能看到weight这个属性,无法看到age这个属性。
// 如果需要看全zhangsan 的所有属性,我们需要 zhangsan.__proto__
zhangsan.__proto__.height = "188"
zhangsan.weight = "90"
handsome_man.prototype.age = "0-100岁哈"
console.log('身高~',zhangsan.height)
console.log('体重~',zhangsan.weight)
console.log('寿命~',zhangsan.age)
再说的稍微简单一点,你的爸爸会有一些基因会遗传给你,比如说不会秃头,脾气暴躁,等等,这些就是原型,你和你爸爸都会有的。但是你爸爸由于时代的原因,学会开船的技能,而你在这个社会上学会的编程,开船和编程就是你们各自的属性。
Object.getOwnPropertyDescriptors(xxxx)可以查看你们各自所有的属性。
但是你们除了各自的属性,还有共同的原型。
zhangsan.__proto__ 就是你的原型上的内容
而你爸爸 handsome_man.prototype 就是你爸爸原型上的内容
所以你身上有什么东西,需要用 Object.getOwnPropertyDescriptors(zhangsan) + zhangsan.__proto__
你爸爸身上有什么东西,需要用 Object.getOwnPropertyDescriptors(handsome_man)+ handsome_man.prototype
XMLHttpRequest,如果我们在控制台打上XMLHttpRequest.prototype 后有open这个方法,
那我们就不能在XMLHttpRequest的构造函数中添加,需要在构造函数的外面添加,例:
function XMLHttpRequest(){
}
XMLHttpRequest.prototype.open = function(){
}