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

最后更新于 2018年07月27日

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

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'));

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

  • weixiao kaixin tushetou jingkong deyi fanu liezui liuhan daku ganga bishi nanguo lihai qian yiwen numu tu yi haixiu se fadai minyan hehe henkaixin huaji biyiyan kuanghan maimeng shui xiaku penqi zhangzui pen aini ye niu laji ok chigua renshi kongbu shuai xiaoxiese touxiao huaixiao jingnu chihuai kaisang xiaoku koubi zhuangbi lianhong kanbujian shafa zhijing xiangjiao dabian yaowan redjing lazhu rizhi duocang chixigua hejiu xixi xiaopen goukun xiaobuchu shenme wusuowei guancha lajing chouyan xiaochi bie zhadanzui zhadanxiao
  1. 二呆

    发表于:
    来自 QQ浏览器 6 in Android N

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

    回复
    1. 木灵鱼儿

      发表于:
      来自 Google Chrome 72.0.3626.109 in Windows 10
      @二呆

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

      回复