1.instanceof 可以判断实例是否在某个对象的原型上:
function A() {
this.a = "a";
}
function B() {
this.b = "b";
}
B.prototype = new A();
var test = new B();
console.log(test instanceof A); //true
console.log(test instanceof B); //true
console.log(test instanceof Object); //true
//test拥有A、B、Object任何一个构造器的属性和方法

  

 
 
2.hasOwnProperty 可以判断对象是否有prototype原型的属性,但是不包括继承过来的属性和方法,如果要判断包括继承的属性,用 in。
function A() {
this.a = "a";
}
A.prototype.b = "b";
console.log(A.prototype.hasOwnProperty("a")); //false
console.log(A.prototype.hasOwnProperty("b")); //true
console.log(A.prototype.hasOwnProperty("hasOwnProperty")); //false
console.log('hasOwnProperty' in A); //true
 
 
 
2.5.访问实例属性时,先在该实例搜索该属性。如果没有该属性,就搜索原型。如果通过原型链实现继承,就会顺着原型链往上搜索。 也就是说,子类的属性不会覆盖继承自原型链的属性。
function A(){
this.prop = 'a';
}
function B(){
this.prop = 'b';
this.method = function(){
console.log(this.prop); //b
delete this.prop;
console.log(this.prop); //a
}
}
B.prototype = new A();
var test = new B();
test.method();

  

 
 
3.每个对象的prototype原型上都有constructor属性,指向构造它的函数
function A() {
this.a = "a";
}
console.log(A.prototype.constructor === A); //true

  

4.call和apply可以改变this的作用域

function A() {
this.name = "a";
this.method = function(){
var arr = Array.prototype.slice.call(arguments);
console.log(arr.join(' ') + " " + this.name);
}
}
var a = new A();
var b = {
name: "b"
}; a.method.call(b, '1', '2', '3'); //1,2,3 b
function A(name) {
this.name = name;
this.method = function(){
console.log(this.name);
}
}
function B() {
A.call(this, "a");
}
var test = new B();
test.method(); // a
test.name = "b";
test.method(); // b

  

区别是appy用的是数组

function A(arg1, arg2) {
this.method = function() {
console.log(arg1, arg2);
};
}
function B() {
A.apply(this, ["1", "2"]);
}
var test = new B();
test.method(); // 1, 2

  

 
5.组合继承方式用call继承属性,用prototype实例化对象继承方法
function A(name) {
this.name = name;
}
A.prototype.method = function() {
console.log(this.name);
}
function B(name) {
A.call(this, name);
}
B.prototype = new A(); var t1 = new B("2");
t1.method(); //2 var t2 = new B("3");
t2.method(); //3 console.log(t1.method == t2.method); //true

  

 
6.工厂模式和寄生构造函数模式
    除了寄生构造函数模式需要用new实例化构造函数,并且包装名被叫做构造函数以外,和工厂模式没有本质性的区别。
    也可以说两者就是概念的区别,结果一样,只是用new能够直观看出是寄生构造函数。
寄生构造函数应用场景在于不污染原生对象的情况下添加方法,缺点在于不能用instanceof来确定所属对象。
 
 
    函数第一次调用时,生成执行上下文与活动对象(actviation object)。
    活动对象里面包含arguments,this,函数内部声明的变量
 
 
7.function的this永远指向调用它的对象,而不是函数创建时所在的对象。而鉴于JS所谓的“万物皆对象”,这个this因此可以是任何物件,比如Global对象。
 
var x = 0;
var foo = {
x:1,
bar:{
x:2,
baz: function () {
console.log(this.x);
}
}
} foo.bar.baz(); // 2
var a = foo.bar.baz;
a(); //0
(foo.bar.baz = foo.bar.baz)() //0

  

 
    因为this永远指向函数被调用时的对象,由于 var a = foo.bar.baz; ,相当于把 foo.bar.baz 的函数复制了一份给 a ,所以执行 a() 的时候,相当于 window.a() ,也就是this指向了执行的对象 window,所以输出0。
    而(foo.bar.baz = foo.bar.baz)();     这句先执行括号内的赋值语句,赋值完成后返回foo.bar.baz 方法。但是执行的却是IIFE,也就是函数而不是对象的方法,this指向的是window这个对象,所以也输出0。
 
foo = function(){
this.myName = "Foo function.";
}
foo.prototype.sayHello = function(){
console.log(this.myName);
}
foo.prototype.bar = function(){
setTimeout(this.sayHello, 10);
}
var f = new foo;
f.bar();
 
    setTimeout会将第一个参数推到下一个事件循环的全局环境执行。由于this指向被调用的环境,相当于setTimeout里的this指向window。所以在这里sayHello方法里的this指向了window导致输出undefined。
 
    如果要输出foo.myName的话,可以用bind方法将setTimeout中的 this 指向foo里的this。setTimeout(this.sayHello.bind(this), 10);
 
 
 
 
8.变量当对象的属性
var obj = {};
var p1;
var p2 = "a";
obj[p1] = 123;
obj[p2] = 456;
console.log(obj[p1]); //123
console.log(obj.a === obj[p2]); //true

  

 

JS高级程序设计 笔记的更多相关文章

  1. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  2. JS高级程序设计--笔记

    1.JS分三个部分:ECMAScript.DOM.BOM       1)ECMAScript:提供核心语言功能       2)DOM:提供访问和操作网页内容的方法和接口       3)BOM:提 ...

  3. js高级程序设计 笔记 --- 错误处理、json和ajax

    1,错误处理 1,try-catch语句 try{可能导致错误的代码} catch(error) {在错误发生时该怎么处理} error.message是所有浏览器都支持的属性. finally语句是 ...

  4. js高级程序设计 笔记 --- 表单

    一,基础知识 在html中,表单是form元素,而在js中,表单对应的是HTMLFormElement类型,继承自HTMLElement,其独特的属性和方法有(常见): action:接收请求的URL ...

  5. js高级程序设计 笔记 --- DOM

    DOM是针对HTML和XML文档的一个API.DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 1,节点层次 DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的 ...

  6. js高级程序设计 笔记 --- 面向对象的程序设计

    1,理解对象 通过对象字面量的方式,创建一个对象,为它添加属性和方法: var obj = { a: 1, b:2, sayA(){ console.log(this.a)}} 1,属性类型: 数据属 ...

  7. js高级程序设计 笔记 --- 引用类型

    一,变量和作用域 1, js变量可以保存两种类型,基本类型.引用类型和symbol类型,基本类型有5种:undefined.null.boolean.number.string,它们都有以下的特征 基 ...

  8. JS高级程序设计笔记一

    /*设置自定义属性*/ var div=document.querySelector("#div1"); div.setAttribute("title",&q ...

  9. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

随机推荐

  1. 把Mongodb配置成windows服务

    在mongodb/bin 下运行命令窗口需要配置日志和db路径,如下:mongod --logpath d:\mongo\logs\logfilename.log --logappend --dbpa ...

  2. 点击切换panel

    //点击标题切换 $("li[class^='fore-']").click(function(){ var nomber = $(this).index();//点击的第几个 $ ...

  3. SetSysColors 修改系统颜色

    首先我们来看一下SetSysColors函数的原型: BOOL WINAPI SetSysColors( __in int cElements, //要改变的对象的数量 __in const INT* ...

  4. 怎么在js中,访问viewbag,viewdata等等的值

    在js中要访问viewbag,viewdata存储的值, var ss='@ViewBag.name'; 一定要加引号,单双随便,还有, ViewBag一定要写规范,不然会编译错误! 成功者的秘诀就是 ...

  5. 用 WEKA 进行数据挖掘,第 1 部分: 简介和回归(转)

    http://www.ibm.com/developerworks/cn/opensource/os-weka1/index.html 简介 什么是 数据挖掘?您会不时地问自己这个问题,因为这个主题越 ...

  6. linux 中压缩记得压缩用c,解压用x

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...

  7. python之编写三层菜单(第一天)

    作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 针对此菜单程序的设计,使用了yaml格式的文本,由python对其内容进行解析为多重字典,然后对字典进行遍历,判断并输出三 ...

  8. SSH框架整合项目(一)——搭建平台和引入依赖

    前言:这个项目是我的第一个实验性项目,最初的立意是制作一个个性化的BBS.由于BBS能够综合大部分功能,因此作为练手的项目来说再好不过.从写第一行代码到完成测试版大概历时2周.中间遇到了不少以前在学习 ...

  9. <hr> 的18种样式

    18 Simple Styles for Horizontal Rules (hr CSS Design) Simple Styles for <hr>'s Code: <!DOCT ...

  10. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...