• 我转过几个弯 绕过那个小雨楼
  • 拿着蒲扇摆着衣衫渡着紧箍咒
  • 不问天涯不停留 喝过几壶酒
  • 不过年少白头道义放胸口
  • 倘若明天之后 遥看前尘剑封侯
  • 似那天上神仙无所求
  • 朝朝暮暮君如梦醒十分不为何理由
  • 是真是假是惶恐是无休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 又过了几个弯 算尽天量道莫慌
  • 踏这田园闻这芳草香
  • 跌跌撞撞仗剑天涯折煞不枉无笔良
  • 是梦是幻是温柔是家乡
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 谁能与我一醉方休

关于面向对象判断是否原型属性的疑问

200 2

首先我们需要创建一个构建函数,并为它添加一个实例属性(实例就是被运行的函数)。

function Box() {};
var box1 = new Box();
box1.name = 'mu';

每个函数都会有一个原型,原型里的数据是共享的,多个变量box1运行同一个函数Box(),这个Box()函数原型中的数据是共有的,并且引用地址相同。

加上就近原则,当实例属性中有对应的属性,会优先调用实例属性,如果没有,就会去原型中查找。

那么我们要去判断这个属性是实例中的属性还是原型中的属性,有两个判断语法:hasOwnProperty() / in

hasOwnProperty()是判断属性是否存在于实例中,是则返回turn,否则返回false。

in 是判断,属性是否存在于实例或者原型中,只要其中一处存在就会返回turn,否则返回false。

那么我们肯定是先判断实例中是否存在对应的属性,再根据有无进行in判断:

  1. 如果有,就不在进行下一个判断了。
  2. 如果没有,就用in判断是否存在,如果存在,肯定是在原型中。

于是我们这样写:

alert(!box1.hasOwnProperty('name') && ('name' in box1));

这样,就可以判断是不是原型属性了,但是有个弊端,就是如果原型和实例中都存在,那不是不知道了?

为了方便,我们写成函数,通过传参的方式进行判断:

function pan(user,cent) {
      return !user.hasOwnProperty(cent) && (cent in user);
};

alert(pan(box1,'name'));

这样写也可以判断,但是传参的时候,我们给name加了引号,这不是意思着这个是一个字符串吗,字符怎么会直接调用到实例属性name呢,在上一个代码中,name也是加了引号,但是他是直接在语法中的,可以理解为必须要有引号才能使用,但是函数中你传入的参数意思就变了呀,直接变成了字符串了,有点不是很明白。

而且我测试就算不加引号也是不影响的,不知道这个引号存在的意义!不知道有大佬能够解释一下吗?

关于实例和原型都有对应的属性,我特意改写了一下,稍微换了个思路,为什么一定要一句话就给结果呢?是吧,我们可以分别给啊!

于是乎:

function pan(user,cent) {
         var shi = user.hasOwnProperty(cent);
         delete user.cent;
         var yuan = cent in user;
         return '[实例中' + shi + ']' + '   ' + '[原型中' + yuan +']';
};

alert(pan(box1,'name'));

原型和实例都给出结果,不是一下就知道吗?

0
  • 本文分类:JavaScript
  • 本文标签:代码地址alert实例属性函数原型box1
  • 流行热度:已超过 200 人围观了本文
  • 最后更新:2018年07月27日 - 17时05分59秒
  • 发布日期:2018年07月27日 - 0时31分00秒
  • 版权申明:本文系作者@木灵鱼儿原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。

评论(2)

    二呆

    发现一只js高手,懂高大上的面向对象,还深究原理,我都没见过这俩函数,只会复制粘贴,突然想插一句不专业的解释,套套近乎:
    box1是对象,对象确定了,那属性是不是字符串,可能在内置函数里已经做判断了吧-_-||现实中有没有这种面向对象的例子呢?感觉举出例子就好理解了,然而我也想不到,好吧,废话完毕~
    (咦,想到一个不知对不对,2个人办某个业务,工作人员让拿出证件,甲说:“我是代办的,身份证行吗?”“可以”然后甲让乙给身份证拍张照发过来。证件是对象,原件是属性,照片是加引号的属性,最后能不能办成,返回true还是false,得看工作人员了,哎呀妈呀,太牵强了~)

      木灵鱼儿

      @二呆 我也是猜测,因为传入的参数是完整传入的(即便他是作为字符串),'name',传入后整个判断的语句还是和上一句写的一样,这时name的引号就已经不是字符串的意思了。

相关文章

微信收款码
微信收款码