木灵鱼儿
阅读:2600
关于面向对象判断是否原型属性的疑问
首先我们需要创建一个构建函数,并为它添加一个实例属性(实例就是被运行的函数)。
function Box() {};
var box1 = new Box();
box1.name = 'mu';
每个函数都会有一个原型,原型里的数据是共享的,多个变量box1运行同一个函数Box(),这个Box()函数原型中的数据是共有的,并且引用地址相同。
加上就近原则,当实例属性中有对应的属性,会优先调用实例属性,如果没有,就会去原型中查找。
那么我们要去判断这个属性是实例中的属性还是原型中的属性,有两个判断语法:hasOwnProperty() / in
hasOwnProperty()是判断属性是否存在于实例中,是则返回turn,否则返回false。
in 是判断,属性是否存在于实例或者原型中,只要其中一处存在就会返回turn,否则返回false。
那么我们肯定是先判断实例中是否存在对应的属性,再根据有无进行in判断:
- 如果有,就不在进行下一个判断了。
- 如果没有,就用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'));
原型和实例都给出结果,不是一下就知道吗?
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。

相关推荐
屏蔽属性
前言对于js的原型链继承,大部分都是知道的,但是对于以下内容,很多人可能并不清楚或者理解不完整,那就是屏蔽属性。什么是屏蔽属性,其实这个功能来源于面向对象语言中的多态,表示父级定义的属性,在子级可以自己扩展,虽然属性名相同,但是功能却可以不同。由于js的继承,它不像强类型语言是完全的复制,js对于继承是通过原型链的方式,当子级没有的情况下会通过在原型链上查找。那么子级如果需要覆写某一个属性,显然它是绝对不能直接修改原型链上的内容,这回导致所有继承的子类产生问题,这显然是不合适的。于是就有了屏蔽属性,当子级去覆写一个原型上存在的属性时,其实并不会去修改原型链的属性,而是给子级自己添加一个对...
第三章 函数
背景简介JavaScript中函数有两个主要特点使其变得特殊:函数是“第一类对象”,更久之前也称之为“第一等公民”函数可以提供作用域什么是第一类对象第一类对象(First-class object)这个名称可以追溯到1960年,原称为第一类公民(First-class citizen),简单点来总结来说,可以在该语言中做到其他元素都能进行的所有操作(你们能干的我也都能干),就可以称为一等公民。一等公民的概念在《计算机程序的构造和解释》书籍中提及,而我们JavaScript的一等公民的概念是因为Brendan Eich(布兰登·艾奇 - JS之父)在设计语言是借鉴了Scheme语言,在Sc...
JSON 格式化对象,对象中存在函数的解决办法,JSON格式化函数
json在格式化对象是,如果是普通的键值对对象还是没有问题的,但是如果他的值是一个函数,在格式化之后,函数就会被剔除。const a = { name: '我爱你', fn: function(){ console.log("我也爱你!") } }; const b = JSON.stringify(a);当你输出变量b的时候,你得到的会是:"{\"name\":\"我爱你\"}"fn不见了!引用JSON.stringify()方法描述中的一段解释:undefined、任意的函数以及 s...
阻止属性默认挂载到组件根元素
vue的组件有一个特性,当我们给组件设置attr属性,而这个属性在组件中并没有props设置的,那么他就会默认挂载到组件的根元素上。例子:<template> <div>我是一个ddd组件</div> </template><template> <ddd class="ddd" /> </template> <script> import ddd from "./ddd"; export default { components:{ ...
JavaScript里面继承是怎样实现的?如何避免原型链上的对象被共享?
JavaScript里面继承是怎样实现的?最简单的就是通过原型链继承,然后衍生出几种方法:构造函数继承、组合继承、原型式继承、寄生继承、寄生组合式继承。function Box() { this.name = "鱼儿", this.age = 666 } Box.prototype.run = function(){ return this.name; } function Pox() { this.run = function() { alert(this.name + this.age); } } Pox.prototype = ne...
Ajax 表单序列化
什么是表单序列化呢?将所有表单的提交通过一个标准化的方法去获取并且提交出去,那就是序列化,也就是说不同的表单,如注册啊,登录啊,修改资料啊,这些东西可以通过一个通用的方法去处理它。那么表单序列化有几个要求:不能发送禁用的表单字段;只发送勾选的复选框和单选按钮;不发送type是reset、submit、file、button以及字段集;多选选择框中的每个选中的值单独一个条目;对于select元素,如果有value值,就指定value作为发送的字段,如果没有,就指定text值;已经将ajax的代码作为单独的一个文件保存,而调用则使用ajax()的方法,之前也做了一个表单提交的方法,在所有条件...
为博客添加鼠标点击特效(富强、民主、文明、和谐...)全平台通用 V2.0
已经写了新版,jq的方法,地址:jq富强,如果连接失效可以在本博客搜索富强,也可以找到对应的文章经过长时间的学习,终于迎来小高潮,更新为2.0版本!2018-10-5 修复预加载js代码失效bug2018-11-3 修复了当鼠标在最右侧点击时导致X轴产生滚动条的问题2019-1-8 更新为2.0版本,修复大量bug,引用自制代码库预览图:使用要求:需要引入自制代码库:[hide]先引入tool.js 下载:蓝奏云再引入封装库base.js 下载:蓝奏云接着引入china.js 下载 : 蓝奏云[/hide]引入方法:以我现在的博客Typecho为例,我们需要在主题的header.ph...

什么是上下文节点???
学html+css的时候有在书上看到过上下文节点,但是也没详细说明,看视频的时候也有人说过,但是也是一笔带过,也没在意,今天学XPath的时候就有关于上下文节点有一个说明,但是只说了一点,没啥详细,所以自己百度了下,如下:代码:<html> <body> <a id = '1'>文本节点1</a> <a id = '2'>文本节点2</a> <a id = '3'>文本节点3</a> </body> </html> ...
二呆
QQ Browser Android发现一只js高手,懂高大上的面向对象,还深究原理,我都没见过这俩函数,只会复制粘贴,突然想插一句不专业的解释,套套近乎:
box1是对象,对象确定了,那属性是不是字符串,可能在内置函数里已经做判断了吧-_-||现实中有没有这种面向对象的例子呢?感觉举出例子就好理解了,然而我也想不到,好吧,废话完毕~
(咦,想到一个不知对不对,2个人办某个业务,工作人员让拿出证件,甲说:“我是代办的,身份证行吗?”“可以”然后甲让乙给身份证拍张照发过来。证件是对象,原件是属性,照片是加引号的属性,最后能不能办成,返回true还是false,得看工作人员了,哎呀妈呀,太牵强了~)
木灵鱼儿
FireFox Windows 10我也是猜测,因为传入的参数是完整传入的(即便他是作为字符串),'name',传入后整个判断的语句还是和上一句写的一样,这时name的引号就已经不是字符串的意思了。