构造函数、原型对象、实例化对象的关系
构造函数(定义时尽量首字母大写)
1、构造函数与其他函数唯一的区别,就是调用他们的方式不同,任何函数只要通过new操作符来调用,那它就可以作为构造函数;而任何函数,如果不通过new操作符 来调用,那它跟普通函数也不会有什么两样。
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName=function(){
alert(this.name)
}
}
//将构造函数当函数使用
var person = new Person("Nicholas",29,"Software Enginner");
person.sayName();//"Nicholas"
//作为普通函数调用
Person("HuHu",18,"Name")
window.sayName()//""HuHu""
//在另一个对象的作用域中调用
var o = new Object();
Person.call(o,"RuiRui",25,"Name");
o.sayName();//"RuiRui"
实例化对象
//简单的说,构造函数的过程就是实例化
var person = new Person();
/*js是基于原型的面向对象语言,所有数据都可以当作一个对象处理,
当然person就是对象,当构造函数过程后,person也是Person的一个实例
Person()就是构造函数
*/
原型对象
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数 (Person)
//函数Person(对象)有个属性prototype(指针)指向原型对象。 Person.prototype(原型对象,实质也是对象),他有个属性constructor(指针) ,又指向 Person函数对象。
function Person(name,age){
this.name = name;
this.age = age;
}
person.prototype.say=function(){
console.log("我叫"+this.name+"今年"+this.age+"岁")
}
var p1 = new Person("小红","14")
/*
*/
console.log(p1.say())
//p1就是person的实例,p1可以使用person.prototype的属性和方法,比如say()方法
/*首先需要明白一个知识点,是在构造函数的原型对象中的。(实例对象原型__proto__指向构造函数的原型,即prototype)p1.__proto__===person.prototype
person.prototype.__proto__===object.prototype
其他方法都是从Object继承过来的
object.prototype.__proto__===null
p1拥有person的所有方法和属性,也有object的方法和属性
*/
总结
三者的关系就是,构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,每个实例对象都由一个指向原型对象的内部指针,所以说实例通过内部指针访问到原型对象,通过原型对象中的constructor找到构造函数
顺便写下原型链
原型连:
获取对象的属性或方法时候,先差找对象自身属性和方法。入股找不到则查找隐式原型__proto__上的属性或方法
如果再查不到就去向上查找__proto__的__proto__直到__proto__为null为止,如果还查找不到就返回undefind