javascript学习笔记(一)
1.基本数据类型包括:Undefined、Null、Boolean、Number、String.
2.基本类型数据是按值访问的,因此可以操作保存在变量中的实际的值.
3.引用类型是保存在内存中的对象,javascript中不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间.
操作对象时,实际上是在操作对象的引用而不是实际的对象
4.引用类型是按引用访问的.
5.ECMAScript不存在函数签名的特性,所以函数没有重载.
6.在javascript中,任何函数,只要通过new操作符来调用,那它就可以作为构造函数。
7.js中函数调用的方式:
a.当作构造函数使用
var person = new Person("Nicholas",29,"Software engineer");
person.sayName();
b.普通函数调用
Person("Grep",27,"Doctor"); //添加到window,作为全局对象
window.sayName();
c.在另一个对象的作用域中调用
var o = new Object();
Person.call(o,"Kristen",25,"Nurse"); //或者使用apply方法
o.sayName();
8.对于ECMAScript引用类型而言,prototype是保存它们所有实例的真正所在,也就是说,toString()和valueOf()等方法实际上都保存在prototype名下。通过每个对象的实例各自去调用。
9.每个函数都包含两个非继承而来的方法:call()和apply()。
作用:在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
a.apply()方法接收两个参数,一个是在其中运行的函数的作用域,另外一个是参数数组,也可以是Array的实例。在不传递参数的情况下,使用call作用相同。
b。二者的强大之处在于 扩充函数赖以运行的作用域
window.color = "red";
var o = {color: "blue"};
function sayColor()
{
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
10.在js代码中,创建对象的模式有三种:
a.工厂模式
注解:
b.构造函数模式
注解:
c.原型模式
注解: 简单的理解是就是包含一个prototype属性的构造函数。任何通过调用构造函数而得到的对象引用都指向原型。
function Person(){}
可以向原型的prototype属性(注意:不是原型,即构造函数)添加其他属性和方法
Person.prototype.name = "Nichholas";
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
var person2 = new Person();
alert(person1 == person2); //false
alert(person1.name == person2.name); //true
11.通过使用hasOwnProperty()方法,可以知道属性是实例属性还是原型属性,由实例对象调用。返回值为boolean类型。
person1.hasOwnProperty("name");
12.跨浏览器取得窗口左边和上边的位置:
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
13.浏览器插件检测
a.IE,IE不支持Netscape式的插件,在IE中检测插件的唯一方式是使用专有的ActiveXObject类型,并尝试创建一个特定插件的实例。IE中是
以COM对象的方式来实现插件的,COM对象是使用唯一标识符来标识。
1 //检测IE中的插件 2 function hasIEPlugin(name) 3 { 4 try 5 { 6 new ActiveXObject(name); 7 return true; 8 } 9 catch(ex) 10 { 11 return false; 12 } 13 } 14 15 //检测flash 16 alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash")); 17 18 //检测QuickTime 19 alert(hasIEPlugin("QuickTime.QuickTime"));
b.非IE浏览器,FireFox、Oprea、Safari等可以通过navigator对象的plugins数组属性来进行检测。plugins数组有如下属性
name:插件的名字
description: 插件的描述
filename: 插件的文件名
length: 插件所处理的 MIME 类型的数量
14.注册处理程序
a.背景介绍: 随着RSS阅读器和在线电子邮件程序的兴起,注册处理程序就为像使用桌面应用程序一样默认使用这些在线应用程序提供了一种方式。
b. FireFox2的navigator对象新增了registerContentHandler()和 registerProtocolHandler()方法(HTML5)
c.参数:MIME URL 应用程序名称
d.举例:将一个站点注册为处理RSS源的处理程序
1 navigator.registerContentHandler("application/rss+xml", 2 "http://www.somereader.com?feed=%s","somereader");
参数解释: 第一个参数是RSS源的MIME类型,第二个参数是应该接收RSS源URL的URL,其中的%s表示RSS源URL,由浏览器自动插入。
15.js中实现继承的方式有: 对象冒充
1 //类1,javascript 构造方法的定义 2 function Animal(name, age) 3 { 4 this.name = name; 5 this.age = age; 6 this.sayHello = function(str) 7 { 8 alert("Hello" + str); 9 } 10 } 11 12 //类2 13 function Dog(name, age) 14 { 15 //把Animal构造函数赋值给this.test 通过运行调用 16 this.test = Animal; 17 this.test(name,age); 18 }
如果说在Dog构造函数中 alert(Animal);则会出现:
打印出来的是Animal这个构造函数,这也就解释了为什么要执行 this.test(name,age) 这句代码了
其执行过程为
1 (function Animal(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 this.sayHello = function(str) 6 { 7 alert("Hello" + str); 8 } 9 10 //alert(this.name + "***" + this.age); 11 })("james", 4);
15.attributes属性
Element 类型是使用attibutes属性的唯一一个DOM节点类型。
attributes 属性中包含一个NameNodeMap,与NodeList类似,是一个 “动态” 的集合。
attributes 属性中包含一系列节点,每一个节点的nodeName 是特性的名称,节点的nodeValue是特性的值。例如
var id = element.attributes.getNamedItem("id").nodeValue;
或
var id = element.attrbutes["id"].nodeValue.
遍历元素的特性,将DOM结构序列化为XML或HTML字符串。
1 function outputAttributes(element) 2 { 3 var pairs = new Array(), 4 attrname, 5 attrValue, 6 i, 7 len; 8 9 for(i=0, len= element.attributes.length; i<len; i++) 10 { 11 attrName = element.attributes[i].nodeName; 12 attrValue = element.attributes[i].nodeValue; 13 paris.push(attrName + "=\"" + attrValue + "\""); 14 } 15 16 return pairs.join(" "); //这里有空格 17 }
说明: 上述代码也是序列化字符串时使用的一种技巧