前端面试之原型链总结

1. 分清普通对象和函数对象的区别。

凡事通过new Function () 创建的对象,都是函数对象,其他的都是普通对象。

2.构造函数


function Person (name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function () {
    alert(this.name)
  }
}
var person1= new Person('小花','12','好好学习');
person1.sayName()
console.log(person1.constructor===Person)
 构造函数都有constructor 的属性,该属性是一个指针,指向Person.也就是说,person1.constructor == Person。这里是完全相等的,不论是==还是====。构造函数的实例化对象的属性指向构造函数本身
 
 

### 3.原型对象: 每个函数对象都有prototype 属性。这个属性指向的是函数的原型对象,这里说的是函数对象,才有prototype 而还有一些不是函数对象,是普通的对象,所有的对象都有_proto这个属性,这个属性和prototype 一样指向的是原型对象。 #### Person.prototype.constructor == Person


  function Person () {};
  Person.prototype // person 
  typeof Person.prototype  // Object 
  typeof Function.prototype //Function 函数对象
  typeof Function.prototype.prototype //undefined

4. proto

构造函数的原型对象的constructor指向构造函数本身 Person.prototype.constructor == Person; 构造函数的实例化对象的proto属性指向构造函数的原型对象 person1.proto == Person.prototyoe;

5. 构造器

创建一个对象: var obj = {} 它等同于下面这样: var obj = new Object()

obj 是构造函数(Object)的一个实例。所以: obj.constructor === Object obj.proto === Object.prototype

新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。 同理,可以创建对象的构造器不仅仅有 Object,也可以是 Array,Date,Function等。 所以我们也可以构造函数来创建 Array、 Date、Function

这里的意思是从js内置对象的角度来说明原型对象的,所有的内置对象都是一个构造器,而在js里面,函数是一等公民,意思就是说函数是js的始祖,其他的都是衍生品。写到这里就是说普通对象也是构造函数的实例化对象。而上面说的只有函数对象才有prototype ,这里是没有的,而是当我们创建出来的实例化对象,有proto 属性,和是构造函数的实例所以有constructor ,构造函数的原型对象也有。

这里总结一下: proto是所有对象都有的,只要是对象都有。prototype只有函数有这个属性。constructor是所有的构造函数生成的实例都有。
person1.proto === Person.prototype
Person.proto == Person.prototype.protype ==Function.prototype
Person.prototype.proto == Object.prototype
Object.proto == Function.prototype
Object.prototype.proto == null
constructor 是对象的构造函数,person1.constructor == Person

Object.prototype==Person.prototype.proto true Object.prototype==Function.proto false Person.prototype == p.prototrue hasOwnProperty判断是自己本身的属性还是继承的 propertyIsEnumerable()是用来检测属性是否属于某个对象的,如果检测到了,返回true,否则返回false. 1.这个属性必须属于实例的,并且不属于原型. 2.这个属性必须是可枚举的,也就是自定义的属性,可以通过for..in循环出来的. 只要符合上面两个要求,就会返回true;

原文链接:https://www.jianshu.com/p/652991a67186

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值