JS原型与原型链使用详解

这次给大家带来JS原型与原型链使用详解,JS原型与原型链使用的注意事项有哪些,下面就是实战案例,一起来看一下。

我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个原型对象,而这个原型对象中拥有的属性和方法可以被所以实例共享。

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.sayName = function(){alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"var person2 = new Person();person2.sayName(); //"Nicholas"alert(person1.sayName == person2.sayName); //true

登录后复制

一、理解原型对象

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个 prototype属性,这个属性指向函数的原型对象。

在默认情况下,所有原型对象都会自动获得一个 constructor(构造函数)属性,这个属性包含一个指向 prototype 属性所在函数的指针。

当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ECMA-262 第 5 版中管这个指针叫 [[Prototype]] 。

虽然在脚本中没有标准的方式访问 [[Prototype]] ,但 Firefox、Safari 和 Chrome 在每个对象上都支持一个属性proto ;而在其他实现中,这个属性对脚本则是完全不可见的。

不过,要明确的真正重要的一点就是,这个连接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间。

以前面使用 Person 构造函数和 Person.prototype 创建实例的代码为例,图 6-1 展示了各个对象之间的关系。

JS原型与原型链使用详解

在此, Person.prototype 指向了原型对象,而 Person.prototype.constructor 又指回了 Person 。

person1 和 person2 都包含一个内部属性,该属性仅仅指向了 Person.prototype ;换句话说,它们与构造函数没有直接的关系。

可以调用 person1.sayName() 。这是通过查找对象属性的过程来实现的。(会先在实例上搜索,如果搜索不到就会继续搜索原型。)

用isPrototypeOf()方法判断实例与原型对象之间的关系alert(Person.prototype.isPrototypeOf(person1)); //truealert(Person.prototype.isPrototypeOf(person2)); //true用Object.getPrototypeOf() 方法返回实例的原型对象alert(Object.getPrototypeOf(person1) == Person.prototype); //true使用 hasOwnProperty() 方法可以检测一个属性是存在于实例中,还是存在于原型中。alert(person1.hasOwnProperty("name")); //false  来着原型person1.name = "Greg";alert(person1.name); //"Greg"——来自实例alert(person1.hasOwnProperty("name")); //true

登录后复制

二、更简单的原型语法

前面例子中每添加一个属性和方法就要敲一遍 Person.prototype 。为减少不必要的输入,也为了从视觉上更好地封装原型的功能,更常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象。

function Person(){}Person.prototype = {  name : "Nicholas",  age : 29,  job: "Software Engineer",  sayName : function () {    alert(this.name);  }};

登录后复制

在上面的代码中,我们将 Person.prototype 设置为等于一个以对象字面量形式创建的新对象。最终结果相同,但有一个例外: constructor 属性不再指向 Person 了。

前面曾经介绍过,每创建一个函数,就会同时创建它的 prototype 对象,这个对象也会自动获得 constructor 属性。

var friend = new Person();alert(friend instanceof Object); //truealert(friend instanceof Person); //truealert(friend.constructor == Person); //falsealert(friend.constructor == Object); //true

登录后复制

在此,用 instanceof 操作符测试 Object 和 Person 仍然返回 true ,但 constructor 属性则等于 Object 而不等于 Person 了。

如果 constructor 的值真的很重要,可以像下面这样特意将它设置回适当的值。

function Person(){}Person.prototype = {  constructor : Person,  name : "Nicholas",  age : 29,  job: "Software Engineer",  sayName : function () {    alert(this.name);  }};

登录后复制

三、原生对象的原型

所有原生引用类型( Object 、 Array 、 String ,等等)都在其构造函数的原型上定义了方法。

例如,在 Array.prototype 中可以找到 sort() 方法,而在 String.prototype 中可以找到substring() 方法。尽管可以这样做,但不推荐修改原生对象的原型。

四、原型对象的问题

原型模式的最大问题是由其共享的本性所导致的。 修改其中的一个,另一个也会受影响。

function Person(){}Person.prototype = {constructor: Person,name : "Nicholas",age : 29,job : "Software Engineer",friends : ["Shelby", "Court"],sayName : function () {alert(this.name);}};var person1 = new Person();var person2 = new Person();person1.friends.push("Van");alert(person1.friends); //"Shelby,Court,Van"alert(person2.friends); //"Shelby,Court,Van"alert(person1.friends === person2.friends); //true

登录后复制

五、原型链

其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。然后层层递进,就构成了实例与原型的链条,这就是所谓原型链的基本概念。

function SuperType(){  this.property = true;}SuperType.prototype.getSuperValue = function(){  return this.property;};function SubType(){  this.subproperty = false;}//继承了 SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = function (){  return this.subproperty;};var instance = new SubType();alert(instance.getSuperValue()); //true

登录后复制

 一张图说明:

JS原型与原型链使用详解

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Servlet3.0与JS通过Ajax交互实例详解

vue实现树形菜单步骤说明

以上就是JS原型与原型链使用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2762906.html

(0)
上一篇 2025年3月8日 10:03:25
下一篇 2025年2月18日 13:05:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS字符串的操作详解

    这次给大家带来JS字符串的操作详解,JS字符串操作的注意事项有哪些,下面就是实战案例,一起来看一下。 charAt()            获取字符串中特定索引处的字符; toupperCase()  将字符串的所有字符转换成大写字母; …

    编程技术 2025年3月8日
    200
  • js中DOM事件绑定使用小技巧

    这次给大家带来js中DOM事件绑定使用小技巧,js中DOM事件绑定使用的注意事项有哪些,下面就是实战案例,一起来看一下。 js事件绑定 JavaScript 有三种事件模型: 内联模型 脚本模型 DOM2 模型 1、内联模型 //基本废除不…

    编程技术 2025年3月8日
    200
  • js解析数据技巧总结

    这次给大家带来js解析数据技巧总结,js解析数据的注意事项有哪些,下面就是实战案例,一起来看一下。 自从有了前后端分离,一些后端小伙伴给出的数据结构也来越混乱了。以为分离减轻了他们的负担接口的质量会非常高但是人的惰性却体现的很“完美”。 由…

    编程技术 2025年3月8日
    200
  • vue.js路由失效无法使用

    这次给大家带来vue.js路由失效无法使用,解决vue.js路由失效无法使用的注意事项有哪些,下面就是实战案例,一起来看一下。 新学了vue.js中的路由 在之前写的vue的demo上加上了简单的路由例子(来自vue-router 2),但…

    编程技术 2025年3月8日
    200
  • JS给动态创建元素添加事件步骤详解

    这次给大家带来JS给动态创建元素添加事件步骤详解,JS给动态创建元素添加事件的注意事项有哪些,下面就是实战案例,一起来看一下。 html中直接生成的元素,添加事件,我们都知道,但是如何为一个动态生成的元素添加事件呢,jquery中的live…

    2025年3月8日
    200
  • nodejs生成二维码(最简洁)

    这次给大家带来nodejs生成二维码(最简洁),nodejs生成二维码的注意事项有哪些,下面就是实战案例,一起来看一下。 一开始使用node-qrcode(注意事项github.com/soldair/node-qrcode),结果安装的时…

    编程技术 2025年3月8日
    200
  • vue激活当前路由步骤详解

    这次给大家带来vue激活当前路由步骤详解,vue激活当前路由的注意事项有哪些,下面就是实战案例,一起来看一下。 一个 route object(路由信息对象) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL …

    2025年3月8日
    200
  • p5.js鼠标交互如何实现并使用

    这次给大家带来p5.js鼠标交互如何实现并使用,p5.js鼠标交互实现并使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一、鼠标交互常用关键词 p5.js提供了许多鼠标操作用的关键词与函数,常用的有: mouseIsPressed:…

    编程技术 2025年3月8日
    200
  • JS匿名自执行函数概念与使用说明

    这次给大家带来JS匿名自执行函数概念与使用说明,JS匿名自执行函数概念与使用的注意事项有哪些,下面就是实战案例,一起来看一下。 1. 匿名函数的常见场景 js中的匿名函数是一种很常见的函数类型,比较常见的场景: //匿名函数的第一种情形 v…

    编程技术 2025年3月8日
    200
  • vue-router使用总结(附代码)

    这次给大家带来vue-router使用总结(附代码),vue-router使用的注意事项有哪些,下面就是实战案例,一起来看一下。 【相关推荐:vue面试题(2020)】  前言 今天面试被问到 vue的动态路由,我竟然没有回答上来,感觉不是…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论