近看完了javascript面向对象基础技术专栏,现把其中比较重要的、易错的知识点做个总结
函数:
创建函数:
1,function f(x) {........}
2,var f = function(x) {......}
上面这两种形式都可以创建名为f()的函数,不过后一种形式可以创建匿名函数
函数定义时可以设置参数,如果传给函数的参数个数不够,则从最左边起依次对应,其余的用undefined赋值,如果传给函数
的参数多于函数定义参数的个数,则多出的参数被忽略.
区别为:1种方式定义的函数,对函数的调用用可以在它之前,
而2种方式对函数的调用必须出现在函数定义之后。
函数的prototype属性:
先来说明一点:每一个函数都包含了一个prototype属性,这个属性指向了一个prototype对象。
function Person(name,sex) { //Person类的构造函数
this.name = name;
this.sex = sex;
}
Person.prototype.age = 12; //为Person类的prototype属性对应的prototype对象的属性赋值,
//相当于为Person类的父类添加属性
Person.prototype.print = function() { //为Person类的父类添加方法
alert(this.name+"_"+this.sex+"_"+this.age);
};
var p1 = new Person("name1","male"); //p1的age属性继承子Person类的父类(即prototype对象)
var p2 = new Person("name2","male");
p1.print(); //name1_male_12
p2.print(); //name2_male_12
p1.age = 34; //改变p1实例的age属性
p1.print(); //name1_male_34
p2.print(); //name2_male_12
Person.prototype.age = 22; //改变Person类的超类的age属性
p1.print(); //name1_male_34(p1的age属性并没有随着prototype属性的改变而改变)
p2.print(); //name2_male_22(p2的age属性发生了改变)
p1.print = function() { //改变p1对象的print方法
alert("i am p1");
}
p1.print(); //i am p1(p1的方法发生了改变)
p2.print(); //name2_male_22(p2的方法并没有改变)
Person.prototype.print = function() { //改变Person超类的print方法
alert("new print method!");
}
p1.print(); //i am p1(p1的print方法仍旧是自己的方法)
p2.print(); //new print method!(p2的print方法随着超类方法的改变而改变)
在JS中,当我们用new操作符创建了一个类的实例对象后,它的方法和属性确实继承了类的prototype属性,类的prototype属性中定义的方法和属性,确实可以被这些实例对象直接引用.但是,当我们对这些实例对象的属性和方法重新赋值或定义后,那么实例对象的属性或方法就不再指向类的prototype属性中定义的属性和方法,此时,即使再对类的prototype属性中相应的方法或属性做修改,也不会反应在实例对象身上.这就解释了上面的例子:
一开始,用new操作符生成了两个对象p1,p2,他们的age属性和print方法都来自(继承于)Person类的prototype属性.然后,我们修改了p1的age属性,后面对Person类的prototype属性中的age重新赋值(Person.prototype.age = 22),p1的age属性并不会随之改变,但是p2的age属性却随之发生了变化,因为p2的age属性还是引自Person类的prototype属性.同样的情况在后面的print方法中也体现了出来.
作用域:
var sco = "global"; //全局变量
function t() {
var sco = "local"; //函数内部的局部变量
alert(sco); //local 优先调用局部变量
}
t(); //local
alert(sco); //global 不能使用函数内的局部变量
在javascript中没有块级别的作用域,也就是说在java或c/c++中我们可以
用"{}"来包围一个块,从而在其中定义块内的局部变量,在"{}"块外部,这些变量不再起作用,
同时,也可以在for循环等控制语句中定义局部的变量,但在javascript中没有此项特性看如下例子:
function f(props) {
for(var i=0; i<10; i++) {}
alert(i); //10 虽然i定义在for循环的控制语句中,但在函数
//的其他位置仍旧可以访问该变量.
if(props == "local") {
var sco = "local";
alert(sco);
}
alert(sco); //同样,函数仍可引用if语句内定义的变量
}
f("local"); //10 local local
在函数内部定义局部变量时要格外小心:
var sco = "global";
function print1() {
alert(sco); //global
}
function print2() {
var sco = "local";
alert(sco); //local
}
function print3() {
alert(sco); //undefined
var sco = "local";
alert(sco); local
}
print1(); //global
print2(); //local
print3(); //undefined local
前面两个函数都很容易理解,关键是第三个:第一个alert语句并没有把全局变量"global"显示出来,
而是undefined,这是因为在print3函数中,我们定义了sco局部变量(不管位置在何处),那么全局的
sco属性在函数内部将不起作用,所以第一个alert中sco其实是局部sco变量,从这个例子我们得出,
在函数内部定义局部变量时,最好是在开头就把所需的变量定义好,以免出错。
以上都是看完js基础系列后的总结,具体可以参看:http://www.iteye.com/wiki/Object_Oriented_JavaScript
分享到:
相关推荐
JavaScript是一种广泛用于网页和网络应用的脚本语言,它的核心特性包括原型链和作用域链。...总结来说,JavaScript的原型链和作用域链是其灵活性和强大功能的基础,理解它们对于深入学习和优化JavaScript代码至关重要。
私有变量和函数在JavaScript中是通过函数作用域实现的。例如: ```javascript function Obj() { var a = 0; // 私有变量 var fn = function() {}; // 私有函数 } ``` 在这个例子中,`a`和`fn`只在`Obj`函数内部...
2. 将构造函数的作用域赋给新对象,使得`this`指向新对象。 3. 如果构造函数有返回值,且返回值是一个对象,那么这个返回值会被作为`new`表达式的结果;否则,新创建的对象作为结果。 ### 原型与`constructor`属性 ...
而《JavaScript函数式.zip》可能是一份关于JavaScript函数式编程的资料集合,函数式编程是一种编程范式,强调使用函数和避免改变状态。其中可能涵盖以下知识点: 1. **纯函数**:理解纯函数的定义,即给定相同的...
3. **闭包**:闭包是JavaScript中的一个关键特性,它允许函数访问并操作其词法作用域内的变量,即使该函数在其外部被调用。闭包常用于实现私有变量和模块化。 4. **柯里化(Currying)**:柯里化是将接受多个参数的...
JavaScript中的函数对象调用模式是编程中至关重要的概念,它涉及到函数作为一等公民、作用域、闭包、原型链等多个核心知识点。这篇博客通过深入分析JavaScript中的函数调用模式,帮助开发者更好地理解和掌握这些概念...
JavaScript是Web开发中的核心语言,其重要特性包括同步与异步处理、作用域与闭包、以及原型和原型链。这些概念是理解JS高级特性的基石。 **同步与异步的区别** 在JavaScript中,同步执行意味着代码按照顺序依次运行...
在JavaScript编程语言中,原型(Prototype)、作用域(Scope)和闭包(Closure)是三个核心概念,对于理解和编写高效、可维护的代码至关重要。本文将深入探讨这三个概念,并通过实例解析它们的工作原理。 首先,...
函数还具有`[[scope]]`属性,也称为作用域链,它关联了函数在执行时能够访问的变量范围。在函数内部定义的变量(如`var b='I am tenfy';`)仅在该函数作用域内可见,而外部变量(如`out_var`)则可以通过作用域链在...
在JavaScript编程语言中,"继承、作用域和闭包"是三个非常重要的概念,它们构成了JavaScript面向对象特性和函数式编程的核心。在这个005课的主题中,我们将深入探讨这三个概念,理解它们如何协同工作,以及如何在...
7. **作用域**:JavaScript有两种作用域,全局作用域和局部作用域。函数内部的变量在函数外部不可见,除非使用`var`、`let`或`const`声明为全局变量。 8. **闭包**:函数可以访问其自身、其父作用域以及全局作用域...
- 闭包是一种特殊的函数,它可以访问自身作用域、父级作用域甚至全局作用域的变量,即使在函数执行完成后,这些变量仍然存在。 3. **JS多态(Polymorphism)** - 多态是指同一种行为可以有不同的表现形式,...
JS中的闭包是函数内部能够访问其词法作用域内变量的能力,即使函数已经返回。闭包常用于实现私有变量和封装,是函数式编程中实现状态隔离的重要工具。 9. 高阶组件(Higher-Order Components, HOCs): 在React等JS...
闭包是JavaScript中一种非常有用的特性,它允许内部函数访问外部函数的作用域链,即使外部函数已经执行完毕。闭包的这种能力为JavaScript提供了强大的抽象能力,但也可能导致内存泄漏,特别是在长时间运行的循环或...
JavaScript函数详解 JavaScript是一种强大的、基于原型的、动态类型的脚本语言,广泛应用于网页和网络应用开发。在JavaScript中,函数扮演着核心角色,它们不仅可以作为可执行的代码块,还可以作为值进行传递和存储...
### JavaScript函数与对象详解 在JavaScript中,函数与对象是两个核心概念,它们构成了这门语言的基石。本文将深入探讨这两个主题,帮助读者更好地理解并掌握JavaScript。 #### 函数 函数是JavaScript中的第一类...
这种定义的函数会立即在当前作用域中创建一个名为`test1`的标识符。 - **变量式(或表达式式)**:这种定义方式将函数赋值给一个变量,例如`var test2 = function(){alert('hello,world');}`。这两种定义方式在功能...
- **箭头函数**:箭头函数不能用作构造函数,因为它们没有`prototype`属性,也没有`new.target`,这使得它们无法创建新的对象实例。 3. **arguments对象** - **常规函数**:常规函数有一个内置的`arguments`对象...