JS高阶-day-02 构造函数
构造函数的定义:通过new关键字来调用,实例化对象的函数叫构造函数。意义:用来批量创建对象。构造函数定义时首字母要大写
构造函数的实例成员和静态成员
1、实例成员
实例成员就是在构造函数内部添加的成员,只能由实例化对象来访问
function Proson(name,age){
this.name=name;
this.age=age;
this.say=function (){
console.log("加油,努力,为了更好的自己");
}
}
var obj=new Parson("小花",20);
console.log(obj.name);
obj.say();//使用实例化对象访问say()对象
console.log(Parson.name)//无法访问
2、静态成员
在构造函数身上添加的成员,只能由构造函数本身来访问
function Proson(name,age){
this.name=name;
this.age=age;
this.say=function (){
console.log("加油,努力,为了更好的自己");
}
}
var obj2=new Parson("小明",20);//实例化对象
console.log(obj2.name);
Person.gender="男";//创建静态成员
console.log(obj2.sex);//undefined
3、构造函数原型prototype
function Parson(name,age){
this.name=name;
this.age=age;
this.say=function (){
console.log(this.name+"正在努力奔跑");
}
}
var obj=new Parson("小花",20);
var obj2=new Parson("小明",19);
//试想一下是不是每个实例化的对象都会添加一say()的方法,这就浪费性能了,因为添加的
//say()都是一样的呀
这时就产生了一个新的想法,能不能让他们共享这个方法实例化的对象共用一个,这时就有了原型函数
JavaScript规定,每一个构造函数都有一个prototype属性
prototype是一个对象属性,其属性值为对象,称为原型对象
可以通过prototype来添加新的属性和方法,此时所有该构造函数的实例对象都具有这些属性和方法
由该构造函数创建的对象会默认连接到该属性上
语法:
构造函数.prototype.属性名=值;
构造函数。prototype.方法名=function (){定义方法体};
我们可以把那些不变的方法,直接定义在prototype上,这样每个实例的对象那个就可以共享这些方法
function Parson(name,age){
this.name=name;
this.age=age;
}
Parson.prototype.say=function(){
console.log("努力奔跑");
}
var obj=new Parson("小兰",20);
console.log(Parson.say());
总结:
- prototype是一个对象属性,其属性值为对象,称为原型对象
- 原型的作用是什么? 共享方法,节约内存
对象原型:
每一个**对象**都会有一个属性 __proto__ 指向构造函数prototype 原型对象,之所以实例化对象可以使用构造函数 prototype原型对象的属性和方法,就是因为有__proto__原型的存在。
__proto__对象原型原型和原型对象prototype是等价的
__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说是一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个睡醒,他只是内部指向原型对象prototype
2
原型链:
当访问一个对象的方法的时候会优先在它本身查找,如果没有找到就会去它的__proto__
上去寻找也就是它的构造函数的prototype上去查找,如果还是没有找到就回去它构造函数的prototype的__proto__
上去查找(一层一层类似这样向上查找),直到找到Object的prototype上,找到就返回,没有找到就返回null打印undefined
Object.prototype.hasOwnPrototype(prop)方法
该方法可以判断一个属性定义在对象本身而不是继承原型链的链的方法,主要用于判断某个的对象那个是否有某个属性,返回值为布尔值
var obj={
name:"小花";
}
obj.prototype.say=function(){
console.log("你好我叫小花");
}
console.log(obj.hasOwnPrototype("name"));
console.log(obj.hasOwnProtoottype("say"));
Object.prototype.isPrototypeOf(Object)方法
isPrototypeOf方法接收一个对象,用来判断当前对象那个是否在传入的参数对象的原型链上,返回值为一个布尔值。
var rel = Object.prototype.isPrototypeOf(new RegExp);
console.log(rel);//true