js每个对象拥有一个原型对象吗?

JavaScript011

js每个对象拥有一个原型对象吗?,第1张

每个JS对象一定对应一个原型对象

我们所创建的每一个函数,解析器都会下个函数中添加一个属性prototype。每一个函数都有自己唯一的prototype

如果函数作为普通函数被调用,prototype没有任何作用

如果作为构造函数被调用,每一个创建的实例都会有一个__proto__ 隐含属性,这个属性指向这个函数的原型对象

原型对象相当于一个公共区域,所有同意一个类的实例都可以访问这个原型对象,因此可以把这些实例的共有内容放到原型对象中。

语法:MyClass.prototype.(属性、方法) = 具体属性或方法

当进行访问时,会先在对象内部寻找调用的属性或者方法,如果没有,再去原型对象中寻找。

原型对象的优点

因为在创建构造函数时可以将共有属性全部添加到原型对象中,所以不需要对单个对象添加这些属性或方法,可以减少代码量,也不会影响全局作用域,直接就可以使每个对象都拥有这些属性核方法。

in

使用in可以检查对象中是否有该属性,但是原型中有,依然会返回true。

hasOwnProperty

可以检查对象中是否含有该属性,这个方法只有当对象自身含有该属性时才返回true。

原型对象也是一个对象,它也有原型对象。所以当原型对象中没有这些属性或方法时,还会去原型对象的原型对象中寻找,知道找到Object的原型对象中,都没有找到的话就是undefined。

对象的toString方法

在页面中直接打印一个对象:[Object Object],这是toString方法的返回值。

如果希望输出的时其他的内容,可以修改toString方法,也就是在原型对象中添加一个toString方法。

原型对象实现继承

function Father(){}function son(){}// 父类方法Father.prototype.money = function(){}// son继承father的方法,****直接拷贝会出现问题// 直接加这一行赋值代码,会使父类也拥有exam方法Son.prototype = Father.prototype// 可以添加子类独有的方法Son.prototype = function exam(){}

避免出现以上的问题,就有了新的解决方案

// Father的实例可以访问原型对象,因此,Son就可以使用Father的原型对象里边的方法Son.prototype = new Father(){}// 如果利用对象的形式修改了原型对象,别忘记使用constructor指回原来的构造函数Son.prototype.constructor = Son

1.原型是 function对象的一个属性,是构造函数构造出对象的公有祖先,而原型本身也是一个对象。

2.从原型的概念出发,我们可以用构造函数构造出的对象提取原型上的属性。

3.因为原型也是一个对象,所以原型本身对自己的属性有增删改查的权利。

4.对象如何知道自己的原型是谁,可以通过对象中的_ proto_ 属性查看,_ proto_ 属性存的就是对象的原型,他是作为对象与原型之间的连接。

5.构造函数构造的对象如何查看是谁构造出自己的,可以通过constructor属性

首先从原型的定义开始解释:

原型是function对象的一个属性,这句话如何理解?

1.function函数其实就是一个对象,当你构造出一个函数时,这个函数对象就有了自己隐式的属性,prototype就是其中的一个属性。

那么先构造出一个函数,在控制台查看,函数对象是否有prototype,并且prototype是否也是一个对象。

我们在控制台中给father的prototype属性添加name属性并赋值,看看是否有效?

给prototype添加属性后,并可以输出name的值。那么也是可以给prototype添加方法的。

给prototype添加say方法实现输出自己的name,执行say(),的确输出了'haha'

2.我们如何理解,prototype是构造函数构造出对象的公有祖先?

首先当构造出函数时prototype就成为了这个函数的属性,并且prototype也可以添加属性和方法,而构造函数构造出的对象能继承构造函数中的方法,且这个对象自身也能添加属性和方法?

那么问题来了?

当我查看对象的name属性时,对象并没有这个属性,那他就会自动去构造出自己的函数中去找是否有这个属性,那当构造函数也没这个属性时,他就会去自己的原型上查找是否有这个属性,如果原型上存在name属性,对象就会获取到这个属性并输出。

而这个获取到原型属性的过程,其实就是一种继承的方式。

举例:

1.prototype是function对象的一个属性;

2.prototype是构造函数构造出对象的公有祖先;

3.prototype也是一个对象。

从总结的第三点可以知道,prototype可以拥有自己的属性和方法,并有权进行增删改查,那么接下来展示prototype如何进行增删改查。

对Mom的prototype属性进行操作。

增:

给出你想要添加的属性,并赋值。

删:

delete

所以prototype对象的增删改查和普通对象的用法相同。

这里还需注意,prototype上的属性只能由自身操作,对象从prototype上获取到的属性进行操作后,并不会影响到prototype。

接下来解释对象的_ proto_ 属性(前后分别是两个_)

_ proto_ 属性里存的是对象的prototype

举例:

接下来解释constructor属性:

对象可以通过该属性查看构造出自己的函数

总结:

prototype是function对象的一个属性,是构造函数构造出的对象的公有祖先,他本身也是一个对象,所以他可以有自己的属性和方法,并对其进行增删改查的操作,对象没有权利修改prototype上的属性和方法。对象可以通过自己的_ proto_ 查看他的prototype,通过constructor查看构造出自己的函数。