如何js 判断对象有属性属性是来自自身对象还是js原型链最上层对象

JS重点整理之JS原型链彻底搞清楚 - CSDN博客
JS重点整理之JS原型链彻底搞清楚
要清楚原型链,首先要弄清楚对象:
最普通的对象:有__proto__属性(指向其原型链),没有prototype属性。原型对象(person.prototype 原型对象还有constructor属性(指向构造函数对象))
函数对象:
凡是通过new Function()创建的都是函数对象。
& & & & & & & & & & & & & 拥有__proto__、prototype属性(指向原型对象)。
& & & & & & & & & & & & & Function、Object、Array、Date、String、自定义函数
& & & & & & & & & & & & & 特例: Function.prototype(是原型对象,却是函数对象,下面会有解释)
function f1(){};
var f2 = function(){};
var f3 = function(&n1&,&n2&,&return n1+n2&);
console.log(typeof f1);
//function
console.log(typeof f2);
//function
console.log(typeof f3);
//function
console.log(typeof Object);
//function
console.log(typeof Array);
//function
console.log(typeof String);
//function
console.log(typeof Date);
//function
console.log(typeof Function);
//function
Array是函数对象,是Function的实例对象,Array是通过newFunction创建出来的。因为Array是Function的实例,所以Array.__proto__ === &Function.prototype
var o1 = new f1();
var o2 = {};
var o3 = new Object();
console.log(typeof o1);
console.log(typeof o2);
console.log(typeof o3);
& & & & 每创建一个函数都会有一个prototype属性,这个属性是一个指针,指向一个对象(通过该构造函数创建实例对象的原型对象)。原型对象是包含特定类型的所有实例共享的属性和方法。原型对象的好处是,可以让所有实例对象共享它所包含的属性和方法。
& & & & 第一块中有提到,原型对象属于普通对象。Function.prototype是个例外,它是原型对象,却又是函数对象,作为一个函数对象,它又没有prototype属性。
function person(){};
console.log(typeof person.prototype) //Object
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype) // 特殊 Function
console.log(typeof Function.prototype.prototype) //undefined 函数对象却没有prototype属性
&&&& functionperson(){};
& & & & 其实原型对象就是构造函数的一个实例对象。person.prototype就是person的一个实例对象。相当于在person创建的时候,自动创建了一个它的实例,并且把这个实例赋值给了prototype。
function person(){};
var temp = new person();
person.prototype =
function Function(){};
var temp = new Function();
Function.prototype = //由new Function()产生的对象都是函数对象
& & & & 从一张图看懂原型对象、构造函数、实例对象之间的关系
function Dog(){};
Dog.prototype.name = &小黄&;
Dog.prototype.age =
Dog.prototype.getAge = function(){
return this.
var dog1 = new Dog();
var dog2 = new Dog();
dog2.name = &小黑&;
console.log(dog1.name); // 小黄 来自原型
console.log(dog2.name); // 小黑 来自实例
//图中的一些关系
dog1.__proto__ === Dog.prototype
Dog.prototype.__proto__ === Object.prototype //继承Object 下面原型链说
dog1.__proto__.__proto__ === Object.prototype
Dog.prototype.constructor === Dog
Dog.prototype.isPrototypeOf(dog1)
获取对象的原型
dog1.__proto__
Object.getPrototypeOf(dog1) === Dog.prototype
原型链是实现继承的主要方法。
先说一下继承,许多OO语言都支持两张继承方式:接口继承、实现继承。
|- 接口继承:只继承方法签名
|- 实现继承:继承实际的方法
由于函数没有签名,在ECMAScript中无法实现接口继承,只支持实现继承,而实现继承主要是依靠原型链来实现。
原型链基本思路:
利用原型让一个引用类型继承另一个引用类型的属性和方法。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数想指针(constructor),而实例对象都包含一个指向原型对象的内部指针(__proto__)。如果让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针(__proto__),另一个原型也包含着一个指向另一个构造函数的指针(constructor)。假如另一个原型又是另一个类型的实例……这就构成了实例与原型的链条。
原型链基本思路(图解):
举例说明:
function animal(){
this.type = &animal&;
animal.prototype.getType = function(){
return this.
function dog(){
this.name = &dog&;
dog.prototype = new animal();
dog.prototype.getName = function(){
return this.
var xiaohuang = new dog();
//原型链关系
xiaohuang.__proto__ === dog.prototype
dog.prototype.__proto__ === animal.prototype
animal.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
从xiaohuang这个实例,看出整个链条
Xiaohuang这个Dog的实例对象继承了Animal,Animal继承了Object。
本文已收录于以下专栏:
相关文章推荐
要弄清楚原型链就要先弄清楚 function 类型,在javascript中没有类的概念,都是函数,所以它是一门函数式的编程语言。类有一个很重要的特性,就是它可以根据它的构造函数来创建以它为模板的对象...
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6
刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?
你看完这篇文章后就会明白所有的疑问。
这篇文章可能比较适合那些在经常在Mac下进行Java编程开发,或者经常使用Java工具的朋友。不关心Java或者不了解Java的朋友可以绕过本文哈~
1. Mac下当你在【终端】输入java -...
这篇文章可能比较适合那些在经常在Mac下进行Java编程开发,或者经常使用Java工具的朋友。不关心Java或者不了解Java的朋友可以绕过本文哈~
1. Mac下当你在【终端】输入java -ve...
刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇文章后就会明白所有的疑问。
self代表类的实例,而非类。...
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位。只有百度好歹做了个可调的表率。而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位,...
电子计算机技术是从美国开始发展起来的,因为美国使用的文字为英文,美国规定的计算机信息交换用的字符编码集是人们熟知的扩展的ASCII码,它以8bit字节为单位存储,ASCII的0-31及127为控制符,...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)判断JS对象是否拥有某属性_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
判断JS对象是否拥有某属性
&&判断JS对象是否拥有某属性
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢随笔 - 449
评论 - 1897博客分类:
浅尝原型链
ECMAScript中的对象是一个无序属性的集合,其属性可以包含基本值、对象或者函数,它拥有一个prototype对象。
一个对象的prototype是以内部的[[Prototype]]属性来引用的。对于prototype对象来说,我们使用__proto__(firefox,chrome)来表示。
原型对象也是简单的对象并且可以拥有它们自己的原型。如果一个对象的原型是一个非null的引用,那么以此类推,这就是原型链。
原型链窥视
我们来看一个例子,看一个普通对象的整个原型链的结构。
var mike = {
sex:"male",
location:"beijing"
console.log(mike);
下图是在chrome浏览器里的变量原型链结构:
原型链结构图:
根据上图,我们可以看到定义的mike对象有两个自身属性sex和location,mike这个对象有个[[Prototype]]属性__proto__,指向了【Object的prototype对象】,该对象没有了内置的[[Prototype]]属性,它自带一个constructor属性,该属性指向【Object构造函数】,在【Object构造函数】中有prototype属性,该属性指回了【Object的prototype对象】,【Object构造函数】中有个__proto__属性指向了【Function的prototype对象】,该对象的constructor指向了【Function构造函数】,而其内的__proto__对象指向了【Object的prototype对象】,在【Function构造函数】中的prototype对象指回了【Function的prototype对象】,__proto__对象指向了【Object的prototype对象】。
以上例子我们可以看到一个普通对象的整个原型链情况,那么原型链到底干嘛用的呢?
原型链用处
原型链是一个指针,指向一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。它的好处就是让所有对象实例共享它包含的属性和方法。
共享属性和方法
function Person(){
Person.prototype.name='mike';
Person.prototype.location='beijing';
Person.prototype.sayHello=function(){
console.log('Hello');
var mike = new Person();
console.log(mike);
var zeromike=new Person();
console.log(zeromike);
我们可以看到在mike和zeromike两个对象中具有相同的属性和方法,这也是原型链最基本的用法。
在ECMAScript中实现继承主要是依靠原型链来实现的。
我们回顾一下构造函数,原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。如果让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针。相应地,另一个原型中也包含着一个指向另一个构造函数的指针。如果另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这是原型链的基本概念。我们就依靠这个概念来实现继承。
function SuperType(){
this.property=
SuperType.prototype.getSuperValue = function(){
return this.
function SubType(){
this.subproperty=
SubType.prototype=new SuperType();
SubType.prototype.getSubValue=function(){
return this.
var instance = new SubType();
console.log(instance.subproperty);
以上代码定义了两个类型:SuperType和SubType。每个类型分别有一个属性和一个方法。它们的主要区别是SubType继承了SuperType。而继承是通过创建SuperType的实例,并将该实例赋给SubType.prototype实现的。实现的本质是重写原型对象,代之以一个新类型的实例。换句话说,原来存在于SuperType的实例中的所有属性和方法,现在也存在于SubType.prototype中了。在确立了继承关系后,给SubType.prototype添加一个方法,这样就在继承了SuperType的属性和方法的基础上又添加了一个新方法。这个例子中的实例及构造函数和原型之间的关系如图:
在上面的代码中,我们没有使用SubType默认提供的原型,而是给它换了新原型:这个新原型就是SuperType的实例。于是,新原型不仅具有作为一个SuperType的实例所拥有的全部属性和方法,而且其内部还有一个指针,指向了SuperType的原型。getSuperValue()方法仍然还在SuperType.prototype中,但property则位于SubType.prototype中。这是因为property是一个实例属性,而getSuperValue()则是一个原型方法。既然SubType.prototype现在是SuperType的实例,那么property当然就位于该实例中了。此外,要注意instance.constructor现在指向的是SuperType,这是因为原来SubType.prototype中的constructor被重写了的缘故。实际上,不是SubType的原型的constructor属性被重写了,而是SubType的原型指向了另一个对象SuperType的原型,而这个原型对象的constructor属性指向的是SuperType.
ITEYE的编辑器是我见过的最差的编辑器了。。。。
zhangzhaoaaa
浏览: 801535 次
来自: 北京
留言止于智者
应该是@Before public void setUp(){ ...
2楼理解很透呀,我用程序测了,是正确的。
另外一个方法实现eclipse tomcat 热部署:http ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 js 判断对象有无属性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信