function Person(name,age){
this.name = name;
this.age = age;
}
var p1 = new Person("小明",20);
var p2 = new Person("小猫",19);
console.log(p1);//Person {name: "小明", age: 20}
console.log(p2);//Person {name: "小猫", age: 19}
构造函数:生产对象的函数 new 函数() 函数就是构造函数
构造函数不是一个特殊的函数,因为new 它 任意一个函数 new 就会变成构造函数
5.原型模式
每一个构造函数都有一个叫prototype(对象),叫构造函数的原型(原型空间)
prototype属性中可以存储一些属性和方法,每一个实例对象(new的构造函数),都有一个__proto__属性,
这个属性指向它的构造函数的prototype属性,通过这个实例对象就可以继承原型中存储的方法和属性。
每个对象(除了null外)都会有的属性__proto__,这个属性会指向该对象的原型。
function Person(name,age){
this.name = nae;
this.age = age;
}
Persom.prototype.act() = function(){
console.log("我是原型中的方法")
}
var p1 = new Person("小美",20);
console.log(p1); // Person {name: "小美", age: 20}
console.log(p1.__proto__ ==== Person.prototype); //true
console.log(p1.__proto__.act) //我是原型中的方法
存在原型中的属性 和 方法,在 new 构造函数时,不会开辟多个空间,在内存中永远只存储一份,解决了构造函数的缺点
5.原型链
实例对象中使用一个属性或者方法,先找自己本身(构造函数中定义)有没有属性和方法,如果没有会去找__proto__(构造函数原型中)
如果构造函数的原型中也没有,继续向上去找原型的构造函数的原型,这种链式关系,叫原型链。
原型的最顶层:Object
判断一个变量是不是数组:
var arr = [2,3,4,5]
1.利用constructor 实例对象原型中有一个constructor属性指向实例对象的构造函数
console.log(arr.constructor === Array) //结果为true
2.instanceof 判断一个对象是不是一个构造函数的实例
console.log(arr instanceof Array); //结果为true
3.每一种对象的构造函数原型上都有toString()不同对象调用toString()都是自己构造函数的原型空间
console.log(arr.toString === Array.prototype.toString) //结果为true