JS 之原型,实例,构造函数之间的关系

JS是面向对象的语言,函数也是对象。下面大致介绍下实例,原型与构造函数之间的关系。

构造函数模式

function Person(name,age){

  this.name = name;

  this.age = age;

  this.sayname = function(){

    alert(this.name);  

  }

}

定义构造函数,函数名字首字母大写,并使用new操作符实例化构造函数。构造函数本身也是函数,只不过可以用来创建对象。构造函数的特点是:

1.没有显式的创建对象

2.将属性和方法赋给力this对象

3.没有return语句

实现步骤为:

1.创建一个新对象

2.将构造函数的作用域赋给新对象(this指向这个新对象)

3.执行构造函数的代码,给构造函数添加属性和方法

4.返回新对象

构造函数的主要问题是,每个方法都要在每个实例上创建一遍。

原型模式

每个函数都有一个prototype属性,这是一个指向其原型对象的指针。原型对象的好处就是可以让对象实例共享其原型对象中的属性和方法。

原型对象中的constructor属性指向其构造函数。构造函数的prototype指向其原型对象。如果使用对象字面量重写构造函数时,记得指定constructor属性,否则constructor会指向object.

实例

new构造函数就可以创建该构造函数的实例,实例对象中的__proto__指向其构造函数对应的原型对象。

构造函数的prototype指向其原型对象,原型对象的constructor指向其构造函数,使用new关键字实例化构造函数,实例化对象的__proto__指向其原始的原型对象。

创建自定义对象的有效方式就是组合使用构造函数模式和原型模式。构造函数模式定义实例属性,原型模式定义方法和公用的属性。这样每个实例都有自己自定义的属性,同时又共享着对方法的引用,最大成本的节省内存。

相关操作符

delete操作符:删除实例中的指定属性。从而可以访问原型中同名的属性。

hasOwnProperty()方法:检测一个属性是存在于该对象的实例中,属于实例属性时,才返回true,否则属于原型属性,则返回false。

in操作符:

  单独使用时,如果该对象中存在这个属性,则返回true,不管这个属性是实例属性还是原型属性。name in object

  使用for-in循环时,返回的是该对象可枚举的所有属性。

每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(__pro__)。

时间: 2024-11-12 19:17:10

JS 之原型,实例,构造函数之间的关系的相关文章

JS继承,原型继承,构造函数的继承,非构造函数"的继承

a.原型继承 一.new运算符的缺点 用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法.比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species. function DOG(name){ this.name = name; this.species = '犬科'; } 然后,生成两个实例对象: var dogA = new DOG('大毛'); var dogB = new DOG('二毛'); 这两个对象的species属性是独立的,修改其中一个,不会影响到另一个.

js面向对象程序设计之构造函数

再上一篇的开头说了创建对象的两种方式,一种是Object构造函数的方式,一种是对象字面量的方法.但这些方式创建多个对象的时候都会产生大量的重复代码.经过技术的进步也演化出来许多的创建对象的模式.本章会介绍 工厂模式,原型模式,构造函数模式和构造函数与原型模式的混合使用. 1,工厂模式 工厂模式是一个比较广为人知的模式,这种模式将细节抽象出来.代码如下 function createPerson(name,age,job){ var o =new Object(); o.name=name; o.

oracle sid,instance_name,db_name,oracle_sid之间的关系

[一]对ORACLE_SID的理解 --------------------------------------------------------------------------------Oracle中SID的作用类似于一个"开关变量"---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例. 我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,从9i开始就默认使用spfile--即服务器

浅谈JS中的构造函数、原型对象(prototype)、实例中的属性/方法之间的关系

原文链接:https://segmentfault.com/a/1190000016951069 构造函数:函数中的一种,通过关键字new可以创建其实例.为了便于区分,通常首字母大写:原型对象:一种特殊的对象,构造函数创建时自动生成:与构造函数形成一一对应,如同人和影子般的关系:实例:通过构造函数实例出来的对象: 在定义构造函数时,在其内部(“{“和”}”)进行定义属性和方法.当我们通过关键字new,对构造函数进行实例化的时候.实例会对构造函数的这些属性进行拷贝出一份副本,然后将其归属为当前实例

JS面向对象-原型对象,实例对象,构造函数的关系

JS中每创建一个函数,该函数就会自动拥有一个prototype属性,为什么那??  因为最根上的object拥有一个prototype属性,而js中所有的对象又都继承自object,所以js中所有的对象都拥有一个prototype属性,而在js中函数也是对象,所以js中每个函数也都有一个prototype属性. 例如:function Person(){...} 和function Dog(){...} 而每一个prototype属性又会获得一个constructor属性 该constructo

实例对象、构造函数、原型之间的关系

实例对象.构造函数和原型之间的关系 实例对象 实例对象中只有__proto__属性,所有的实例都指向自己构造函数的原型.__proto__属性里面有构造器construction和__proto__. 构造器指向原型所属的构造函数,__proto__属性指向Object的原型. 实例对象里面有一个特例: 这个是一个特例,里面有prototype和__proto__俩个属性,__proto__指向Function的原型,prototype是一个单纯的对象,是一个Object的实例,相当于{},就是

关于JS面向对象中原型和原型链以及他们之间的关系及this的详解

一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__proto__属性, 当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性指向 构造函数的prototype. 1 zhangsan.__proto__==Person.prototype 注:在上述代码中Person是构造函数,zhangsan则是该构造函数的一个实例化对象.

如何确定 原型与实例之间的关系

instanceof  可以用来确定实例与原型之间是否存在关系 只有当原型与实例有关系的时候 才能依赖于 instanceof 确定 function SpecialArray(){ //创建数组 var values = new Array(); //添加值 values.push.apply(values, arguments); //添加方法 values.toPipedString = function(){ return this.join("|"); }; //返回数组 r

js中prototype,__proto__,constructor之间的关系

首先,我们需要了解三点: 1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象: 2. 每一个原型对象都会自动获得一个constructor属性,该属性只想prototype所在函数的指针: 3. 当调用构造函数创建实例时,该实例内部将包含一个指向构造函数原型对象的指针,在大部分浏览器中用__proto__标识: 从上面这三点我们可以了解到: 正常情况下:prototype属性 -> 原型对象 原型对象的constructor属性 -> 构造函数(即拥有p