前端面试之原型链总结

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

阅读更多
想对作者说点什么? 我来说一句

前端面试总结

2018年03月27日 23KB 下载

没有更多推荐了,返回首页

不良信息举报

前端面试之原型链总结

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭