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