javascript原型链,原型链js简书

js中什么是原型对象和原型链

每个 JavaScript 对象内部都有一个指向其它对象的“指针”或者 “引用“, 并通过这种方式在对象之间建立了一种联系,形成了一种链式结构,我的理解这就是所谓的原型链。

目前创新互联已为超过千家的企业提供了网站建设、域名、虚拟主机绵阳服务器托管、企业网站设计、浮山网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

function F() {} // F 是一个函数,函数也是对象,而且每个函数都有一个属性叫:"prototype"

var o = new F(); // F.prototype 就是 o 的原型对象

console.log(o.name);

// 输出: undefined

F.prototype.name = "foo";

console.log(o.name);

// 输出: foo

// 上面这个例子是想说明:通过 new 在对象 o 与对象 F.prototype 之间建立了联系, 这个建立联系

// 的方式有人叫 "原型继承" 。 当访问的对象属性不存在时,就会沿着原型链去查找。

js原型和原型链的理解是什么?

讲原型和原型链,如果是讲定义,那很是晦涩难懂,今天我们就通俗易懂的说说原型与原型链。还需要借助阮老师的“Javascript继承机制的设计思想”。

1,比如我们还要针对学生统计每个人的总分是多少,我们改造构造函数Person,构造函数上有个 prototype属性,这个属性就是这个构造函数的原型(显式原型),这个原型是函数特有,prototype对象默认有两个属性,constructor属性和__proto__属性。

2,constructor,这个属性包含了一个指针,指回原构造函数。通过控制台输出,我们可以看到我们实例化的对象,有个__proto__属性,这个属性就是隐式原型,这个__proto__是所有对象都有的属性。

3,由于JavaScript的一切都是对象(除undefined),又由于所有对象都有__proto__属性,__proto__又指向构造函数的prototype,当我们访问一个对象的属性时。

4,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。原型链,说明是链式,而不是环,说明有终点,它的终点是null。

js原型链和继承的理解

Object() Function() Array() 等等都为构造函数。

Js 面向对象与传统oop 有些不同,语法较高级 语法糖封装。

This 为指针。指向this作用域的调用者

1.原型继承链顶端为Object 。Js函数是对象

2.当读取对象中的属性时,先去实例本身中搜索,如搜索不到则去指向的原型中搜索

1.原型的存在意义在于实现继承共享,是在构造函数中定义的一个成员对象,在下次实例化时不需要在构造函数中定义成员 就可实现实例共享方法属性。

例子:通常为。 构造函数.prototype.xxx=我想实现实例继承的东西 -》 new 构造函数 -》新实例a对象.原型指针指向构造函数的xxx对象(引用类型)

例子:Array 不等于 Array() 原因 Array为一个函数,而Array()为一个构造函数调用语句,故Array拥有prototype对象用于实例的共享继承,Array()产生一个实例 故只能拥有prototype对象的私有指针 proto

2.在使用原型继承时 不能使用字面量 构造函数.prototype={} 的方式重写原型对象 。因为会导致该原型对象的constructor属性被重写,在生成的实例中导致constructor指向Object并且会切断之前原型对象的联系,破坏原型链。

3.JavaScript 主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的

例子:

xxx实例. proto -》function xxx()构造函数.prototype对象故xxx. proto === xxx.prototype

xxx.prototype. proto -》Object.prototype因为所有对象都为Object函数构造来的。故xxx.prototype. proto ===Object.prototype。

Object.prototype. proto 为原型链顶端 proto 定义了尚未使用所以为null故Object.prototype. proto ===null约定俗成。

instanceof 用来判断某实例是否为某构造函数的实例

isPrototypeOf 用于判断某实例是否拥有某构造函数的原型对象指针

1.原型模式有忽略构造函数定义初始值步骤及原型中操作引用类型的缺点。

所以需要组合使用 构造函数模式+原型模式 来创建实例。在构造函数中定义实例的属性,而需共享的方法就定义在原型对象中。

继承:在子构造函数中调用 父.call(this, name); 实现构造函数之间的属性继承。使用 子.prototype = new 父(); 子.prototype.constructor = 子;实现方法的继承。

2.如要在生产环境下的构造函数新增方法(如Array) 需要使用一个类似于工厂函数的寄生构造函数模式 在构造函数中返回一个修改后的对象

javascript原型,原型链 有什么特点

javascript原型,原型链特点:原型链实现了继承。

JS中每个函数都存在有一个原型对象属性prototype。并且所有函数的默认原型都是Object的实例。每个继承父函数的子函数的对象都包含一个内部属性proto。该属性包含一个指针,指向父函数的prototype。若父函数的原型对象的_proto_属性为再上一层函数。在此过程中就形成了原型链。

原型链的作用是用来实现继承,比如我们新建一个数组,数组的方法就是从数组的原型上继承而来的。

var arr = [];

arr.map === Array.prototype.map //arr.map

是从arr.__proto__上继承下来的,arr.__proto__也就是Array.prototype。

扩展资料:

1.JS中每个函数都存在有一个原型对象属性prototype。并且所有函数的默认原型都是Object的实例。

2.每个继承父函数的子函数的对象都包含一个内部属性_proto_。该属性包含一个指针,指向父函数的prototype。若父函数的原型对象的_proto_属性为再上一层函数。在此过程中就形成了原型链。

3.原型链实现了继承。原型链存在两个问题:a 包含引用类型值的原型属性会被所有实例共享。b 在创建子类型时,无法向超类型的构造函数中传递参数。

参考资料:百度百科-javascript

javascript 原型,原型链是什么?有什么特点

原型是JS的一个引用对象,就是说prototype本身就是一个对象,和OBJECT没什么不同

所有的属性中都会包含一个属性__proto__来指向你的原型对象

例如

function ROOT(){}

ROOT.A = 1

ROOT.prototype.B = 2;

//object对象是默认指向OBJECT直到你指定一个proto指针

//这里由于child本身是已经实例化的OBJECT,所以会复制一份指定的root的prototype指针引用到child

var child = {__proto__:ROOT.prototype}

//这里是child1原__proto__是指向空的object

//这里对child1的prototype指针进行了替换

var child1 = function (){};

child1.prototype = ROOT.prototype

//剩下的结果就不说了

var chd = new child1;

console.log(child.B)

console.log(chd.B)

//你会发现除了child无法实例化,其他的特性都继承了

console.log(chd.constructor)

console.log(chd.__proto__)

console.log(child.constructor)

console.log(child.__proto__)

所以这里面

__proto__是指向的创建者的原型对象

constructor是指向的创建者

prototype是当前对象的原型对象

实例化的对象会先从实例化对象里查找属性,如果找不到会在__proto__里面查找指向的prototype的属性

在JavaScript的原型链继承方式中,为什么子类在调用父类的构造函数时不能传参数?

我认为,不是不能给父类构造函数传参数,而是传的参数最终不能起到作用。举个例子:

function Parents(ln) { this.lastName=ln; } //定义父类构造函数

function Children(fn,ln) { this.firstName=fn; } //定义子类,lastName 继承自父类

//原型链继承,给父类构造函数传入参数,试图用 Children 类构造函数中传入的 ln 初始化 lastName:

Children.prototype=new Parents(this ln);

//尝试建立对象实例:

var child=new Children("Bill","Gates");

//输出结果。很明显,lastNmae 并没有得到想要的值:

alert(child.firstName);//Bill

alert(child.lastName);//Undefine

这说明给父类构造函数传递参数是无效的。原因就在于原型链方式中,调用父类构造函数的代码并不在子类构造函数中,建立对象实例时给的属性值(即子类构造函数的参数)并不能影响到子类调用的父类构造函数。

当然,在继承时可以这样写:

Children.prototype=new Parents("Gates");//调用父类构造函数时给固定值

但是,这个固定的属性值必定会影响所有子类的对象实例,相当于子类构造函数“擅作主张”给所有对象实例的属性提前“赋了值”。这样写是不太符合面向对象编程的规则的。


标题名称:javascript原型链,原型链js简书
网站路径:http://azwzsj.com/article/dsigssg.html