`
suhenhappy
  • 浏览: 55617 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

JavaScript - hasOwnProperty,Functions,this

 
阅读更多

hasOwnProperty

为了判断一个对象是否包含自定义属性而不是原型链上的属性, 我们需要使用继承自Object.prototypehasOwnProperty方法。

注意:通过判断一个属性是否undefined不够的。 因为一个属性可能确实存在,只不过它的值被设置为undefined

hasOwnProperty是JavaScript中唯一一个处理属性但是不需要查找原型链的方法。

?
1
2
3
4
5
6
7
8
9
// 修改Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};
foo.bar; // 1
'bar' in foo; // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true

只有hasOwnProperty可以给出正确和期望的结果,这在遍历对象的属性时会很有用。没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。

hasOwnProperty作为属性(hasOwnPropertyas a property)

JavaScript不会保护hasOwnProperty被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部hasOwnProperty函数来获取正确的结果。

?
1
2
3
4
5
6
7
8
9
10
11
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 总是返回 false
// 使用其它对象的 hasOwnProperty,并将其上下为设置为foo
{}.hasOwnProperty.call(foo, 'bar'); // true

结论(In conclusion)

当检查对象上某个属性是否存在时,hasOwnProperty唯一可用的方法。 同时在使用for inloop遍历对象时,推荐总是使用hasOwnProperty方法, 这将会避免原型对象扩展带来的干扰。

函数(Functions)

函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递对异步函数中。

函数声明(Thefunctiondeclaration)

?
1
function foo() {}

上面的方法会在执行前被解析(hoisted),因此它存在于当前上下文的任意一个地方, 即使在函数定义体的上面被调用也是对的。

?
1
2
foo(); // 正常运行,因为foo在代码运行前已经被创建
function foo() {}

函数赋值表达式(Thefunctionexpression)

?
1
var foo = function() {};

这个例子把一个匿名的函数赋值给变量foo

?
1
2
3
foo; // 'undefined'
foo(); // 出错:TypeError
var foo = function() {};

由于var定义了一个声明语句,对变量foo的解析是在代码运行之前,因此foo变量在代码运行时已经被定义过了。

但是由于赋值语句只在运行时执行,因此在相应代码执行之前,foo的值缺省为undefined

命名函数的赋值表达式(Named function expression)

另外一个特殊的情况是将命名函数赋值给一个变量。

?
1
2
3
4
var foo = function bar() {
bar(); // 正常运行
}
bar(); // 出错:ReferenceError

bar函数声明外是不可见的,这是因为我们已经把函数赋值给了foo; 然而在bar内部依然可见。这是由于 JavaScript 的命名处理所致, 函数名在函数内总是可见的。

this 的工作原理(Howthisworks)

JavaScript 有一套完全不同于其它语言的对this的处理机制。 在种不同的情况下 ,this指向的各不相同。

全局范围内(The global scope)

?
1
this;

当在全部范围内使用this,它将会指向全局对象。 (译者注:浏览器中运行的JavaScript脚本,这个全局对象是 window)

函数调用(Calling a function)

?
1
foo();

这里this也会指向全局对象。

ES5 注意:在严格模式下(strict mode),不存在全局变量。 这种情况下this将会是undefined。 (译者注:ES5指的是ECMAScript 5,是2009-12发布的最新的 JavaScript 版本。)

方法调用(Calling a method)

?
1
test.foo();

这个例子中,this指向test对象。

调用构造函数(Calling a constructor)

?
1
new foo();

如果函数倾向于和new关键词一块使用,则我们称这个函数是构造函数。 在函数内部,this指向新创建的对象。

显式的设置this(Explicit setting ofthis

?
1
2
3
4
5
function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示
foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3

当使用Function.prototype上的call或者apply方法时,函数内的this将会被显式设置为函数调用的第一个参数。

因此函数调用的规则在上例中已经不适用了,在foo函数内this被设置成了bar

注意:在对象的字面声明语法中,this不能用来指向对象本身。 因此var obj = {me: this}中的me不会指向obj,因为this只可能出现在上述的五种情况中。 (译者注:这个例子中,如果是在浏览器中运行,obj.me等于window对象。)

常见误解(Common pitfalls)

尽管大部分的情况都说的过去,不过第一个规则(译者注:这里指的应该是第二个规则,也就是直接调用函数时,this指向全局对象) 被认为是JavaScript语言另一个错误设计的地方,因为它从来就没有实际的用途。

?
1
2
3
4
5
6
Foo.method = function() {
function test() {
// this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象)
}
test();
}

一个常见的误解是test中的this将会指向Foo对象,实际上不是这样子的。

为了在test中获取对Foo对象的引用,我们需要在method函数内部创建一个局部变量指向Foo对象。

?
1
2
3
4
5
6
7
Foo.method = function() {
var that = this;
function test() {
// 使用 that 来指向 Foo 对象
}
test();
}

that只是我们随意起的名字,不过这个名字被广泛的用来指向外部的this对象。 在closures一节,我们可以看到that可以作为参数传递。

方法的赋值表达式(Assigning methods)

另一个看起来奇怪的地方是函数别名,也就是将一个方法赋值给一个变量。

?
1
2
var test = someObject.methodTest;
test();

上例中,test就像一个普通的函数被调用;因此,函数内的this将不再被指向到someObject对象。

虽然this的晚绑定特性似乎并不友好,但是这确实基于原型继承赖以生存的土壤。

?
1
2
3
4
5
6
7
function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = Foo.prototype;
new Bar().method();

method被调用时,this将会指向Bar的实例对象。

分享到:
评论

相关推荐

    理解JAVASCRIPT中hasOwnProperty()的作用

    JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 hasOwnProperty()使用方法: object.hasOwnProperty(proName)其中参数object是必选项。一个对象的实例。proName是必...

    js-Polyfill_Object-hasOwnProperty

    js-Polyfill_Object-...//Polyfilled & Native:console.dir([obj1.hasOwnProperty('a'),//trueobj1.hasOwnProperty('b'),//trueobj1.hasOwnProperty('c'),//falseobj2.hasOwnProperty('a'),//trueobj2.hasOwnProperty

    javascript中hasOwnProperty() 方法使用指南

    hasOwnProperty() 方法用来判断某个对象是否含有指定的自身属性。 语法 obj.hasOwnProperty(prop) 参数 •prop •要检测的属性名称。 描述 所有继承了 Object.prototype 的对象都会从原型链上继承到 ...

    JavaScript hasOwnProperty() 函数实例详解

    hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。下面通过本文给大家分享JavaScript hasOwnProperty() 函数实例讲解,感兴趣的朋友一起看看吧

    详谈js使用in和hasOwnProperty获取对象属性的区别

    下面小编就为大家带来一篇详谈js使用in和hasOwnProperty获取对象属性的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅析hasOwnProperty方法的应用

    JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 使用方法:object.hasOwnProperty(proName) 其中参数object是必选项。一个对象的实例。proName是必选项。一个属性名称...

    javascript-tips:一些很棒JavaScript技巧可以帮助您提高代码质量

    一些JavaScript技巧可以使您的代码比以前更加出色! JavaScript是一种很棒的语言,但是您不时会迷失它现在提供的众多功能。 该存储库将为您提供一些简短明了的提示,以改进您的代码或使事情更容易阅读或更好地阅读...

    JavaScript isPrototypeOf和hasOwnProperty使用区别

    JavaScript isPrototypeOf和hasOwnProperty的使用技巧,需要的朋友的朋友可以参考下。

    JavaScript中in和hasOwnProperty区别详解

    in操作符只要通过对象能访问到属性就返回true。hasOwnProperty()只在属性存在于实例中时才返回true。下面通过本文给大家分享JavaScript中in和hasOwnProperty区别详解,感兴趣的朋友一起看看吧

    Javascript学习笔记之 对象篇(三) : hasOwnProperty

    // Poisoning Object.prototype Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar;...Javascript 中没有其他方法能判断一个属性是定义在对象本身还是继承自原型链。 hasOwnProperty 作为

    Javascript hasOwnProperty 方法 & in 关键字

    hasOwnProperty :如果 object 具有指定名称的属性,那么方法返回 true;反之则返回 false。

    JavascriptDOM编程视频教程(17讲)

    教程名称:Javascript DOM编程视频教程(17讲) 课程目录:【】1.JavascriptDOM编程_在什么位置编写JS代码【】10.JavascriptDOM编程_删除节点【】11.JavascriptDOM编程_添加删除节点的实验...

    js代码-去重:filter + hasOwnProperty

    js代码-去重:filter + hasOwnProperty

    JavaScript权威指南

    Using the Rest of This Book Section 1.10. Exploring JavaScript Part I: Core JavaScript Chapter 2. Lexical Structure Section 2.1. Character Set Section 2.2. Case Sensitivity Section 2.3....

    Javascript中的for in循环和hasOwnProperty结合使用

    当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误

    javascript语言精粹(中英文版)

    hasOwnProperty Section A.14. Object Appendix B. Bad Parts Section B.1. == Section B.2. with Statement Section B.3. eval Section B.4. continue Statement Section B.5. switch Fall Through ...

    weapp.qrcode.js

    var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var defineProperty = Object.defineProperty; var gOPD = Object.getOwnPropertyDescriptor; var isArray = function ...

Global site tag (gtag.js) - Google Analytics