js中的实例对象及原型对象简单讲解

因为平时做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(){

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值