javascript之面向对象编程续

来源:互联网 发布:常用的nosql数据库 编辑:程序博客网 时间:2024/06/06 18:24

原型方法来解决构造函数所不能解决的问题;

每一个函数都有一个prototype原型属性,这个属性是一个指针,指向一个对象,这个对象的用途是让所有构造函数的实例共享他所包含的属性和方法,为啥说他是共享的呢?

无论何时,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个 prototype属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。 【也就是说,一个新建的函数有一个固定的属性prototype指向的是一个对象,这个对象也有一个默认的固定属性constructor指向的是prototype所在的函数对象】

创建了构造函数之后,这个构造函数的原型对象prototype会有一个默认的属性constructor,但是当我们打印一个构造函数的prototype的时候会发现其实这个对象还包含了一些我们自定义属性,其实这些自定义的属性是继承于Object上的;各个对象教间的关系--


其实对象的[[prototype]]属性指向的是构成该对象的构造函数的原型(就拿构造函数的实例而言,其也是一个对象那么这个对象的_proto_属性指向的就是Person的prototype),但是不幸的是我们不能像访问一般的属性一样访问对象属性_proto_(会返回undefined)一个很重要的思想,在JS中那就是万物皆对象

在JS中还有一个方法是Object.getPrototypeOf(构造函数的实例)返回的将是一个构造函数的原型;这也是访问实例中

其实,每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中找到了这个属性,则返回该属性的值。也就是说,在我们调用person1.sayName()的时候,会先后执行两次搜索。首先,解析器会问:“实例person1sayName 属性吗?”答:“没有。”然后,它继续搜索,再问:“person1的原型有sayName属性吗?”答:“有。”于是,它就读取那个保存在原型对象中的函数。当我们调用person2.sayName()时,将会重现相同的搜索过程,得到相同的结果。而这正是多个对象实例共享原型所保存的属性和方法的基本原理。

//用来验证构造函数的那些特性function Dog(name,age){this.name = name;this.age = age,this.eat = function(){console.log("一个"+this.age+"岁的"+this.name+"正在eating")}console.log(this)}var dog  = new Dog("哈士奇","12");var dog2 = new Dog("中华田园犬","14");//新建了实例console.log(dog.constructor==Dog)//truedog.eat();/*作为普通的函数调用的时候,因为this指向的是函数的调用者,而这个函数就是在全局内定义的,调用的时候也是在全局内调用的,所以this指向的是window,里面的属性也就是在全局内定义的全局变量*/Dog("金毛","13");Dog("狮子")console.log(name);//狮子;/*prototype模式*/function Plant(){}Plant.prototype.name = "蔬菜";Plant.prototype.class = "有技术次啊";Plant.prototype.fun = function(){console.warn("我们都是好孩子")}var plant = new Plant();var plant1 = new Plant();console.log(plant);//空对象;因为属性和方法都定义在了原型对象上了。console.log(Plant.prototype)//返回一个对象,对象里面有自己定义的属性和方法,这个很容易理解;console.log(Plant.prototype.constructor)//指向的是prototype所在的函数,也就是Plant()console.log(Plant.prototype.isPrototypeOf(plant))//构造函数Plant的原型是实例plant的原型么,当然是trueconsole.log(Plant.prototype.isPrototypeOf(plant1))plant1.fun();



原创粉丝点击