JS原型规则

  • 原型的5个规则

  •  
  • 所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”意外)
  • 所有的引用类型(数组,对象,函数),都有一个__proto__(隐式原型)属性,属性值是一个普通对象
  • 所有的函数都有一个prototype(显式原型)属性,属性值是一个普通对象
  • 所有的引用类型(数组,对象,函数),__proto__属性指向它的构造函数“prototype”属性值
  • function Foo(name, age) {
    	this.age = age
    	this.name = name
    	this.class = 'class-1'
    }
    var f = Foo('zhangsan', 23)
    console.log(f.__proto__ === Foo.prototype) // true

     

  • 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回它的__proto__(即它的构造函数的prptotype)中寻找
  • function Adf(name, age) {
    	this.name = name
    }
    Adf.prototype.alertName = function () {
    	alert(this.name)
    }
    var a = new Adf('zhang')
    a.printName = function () {
    	console.log(this.name)
    }
    a.printName()
    a.alertName()

    循环自身的属性

    还是对上面的测试代码来说,如果对进行循环的话,可以找到,name属性,alertName属性,printName属性,但是一般情况下,我们只希望得到这个对象自身定义的属性,比如:name属性与printName属性

    var item
    for(item in f){
        if(f.hasOwnProperty(item)){
            console.log(item);
         // 高级浏览器已经在forin中屏蔽了来自原型的属性
         //但在这里建议大家还是加上这个判断,保证程序的健壮性(程序对于规范要求以外的输入情况的处理能力)
    
        }
    }

this

对上面测试代码来说,永远指向对象本身,所以执行a.alertName 
可以弹出zhang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值