构造函数,原型,原型链

1.对应名称
portotype原型
porto__原型链( 连接点)
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
2.从属关系
portotype == > 函数属性: 对象 {}
porto == > 对象Object的属性: 对象 {}
对象的__porto__保存着该对象的构造函数的portotype
Test.prototype是对象, 里面包含__porto

原型链的顶层Object.prototype

 function Test() {
        this.a = 1
    }
    Test.prototype.b = 2
    console.log(Test.prototype)
    const test = new Test()
    console.log(test.__proto__)
    console.log(test.__proto__ === Test.prototype)
    console.log(Test.prototype.__proto__)
    console.log(Test.prototype.__proto__ === Object.prototype)
    console.log(Object.prototype.__proto__)
    Object.prototype.c = 3
    console.log(test)

3.任意函数都可以使用new关键字进行调用 通过new使得普通的函数变成了构造函数,一般情况下构造函数的首字母需要大写
new关键字做了四件事。
1-开辟了一块内存空间 创建了一个新对象
2-让this指向这个空对象 this={}
3-调用构造函数 给对象添加属性和方法 this.name=name;this.age=age
4-返回这个新对象 return this

在构造函数中 return 基本类型 不会影响构造函数的值
而 return 对象类型(数组,对象,函数) 则会替代构造函数返回该对象

4.对象的hasOwnProperty()方法用来检测给定的属性是否是对象的自由属性,如果是继承属性则返回false(可以用来剔除原型链上的属性)

function Fn(age){
    this.age=age;
}
Fn.prototype.say="hello";
var user1=new Fn('122');
//循环打印出对象自身的属性
for(var i=0 in user1){
    if(user1.hasOwnProperty(i)){
        console.log([i]+":"+user1[i]);//age:122
    }
}

in作用:判断对象的属性是自由属性还是原型链上的属性,如果对象的自由属性或者继承属性中包含这个属性则返回true。

function Fn(age){
    this.age=age;
}
Fn.prototype.say="hello";
var user1=new Fn('122');
console.log('age' in user1) //true  对象自身的属性返回true
console.log('say' in user1) //true  对象原型上的属性返回true

isPrototypeOf作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中

function Fn(name){
                this.name=name;
}
var user=Object.create(Fn);//Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__(即原型指向这个对象)。
console.log(Fn.isPrototypeOf(user)) //true
            
var user1=new Fn('app');
console.log(Fn.prototype.isPrototypeOf(user1)) //true

instanceof作用:检测一个对象是否是另一个对象的实例。

function Fn(age){
                this.age=age;
}
var user1=new Fn('12');        
console.log(user1 instanceof Fn) //true

注意:并不是所有的对象对会继承自object.protetype,特例Object.create(null);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值