这本书适合初级和中级的JSer
主要讲他this prototype constructor 这几个概念讲得比较多,讲解的水平适中,没涉及到特别复杂的情况,实在讲基础性的东西
后面讲基础对象的章节基本可以一带而过
只要使用new调用某函数,就会将该函数的this设置为正在构建的新对象,并默认返回新创建的对象(this)
注意点
typeof null //object
var myFunction = new Function('x','y','return x* y')
typeof myFunction //function
var myRegExp = new RegEXP('\abc\')
typeof myRegExp // function
其他一般情况下 typeof基本类型 返回的是基本类型 非基本类型的都是object
基本类型一般是指非new出来的基本类型例如
- var a = String('123') //基本类型 typeof 后为string
- var b = new String('123') //复杂类型 typeof 后为object
所有字变量/new方式出来的变量都会对应其constructor
var myNumber = new Number('23')
var myNumberL = 23
myNumber.constructor === Number //true
myNumberL.constructor ===Number //true
和constructor的验证不一样
自变量的instanceof 不会对应着包装类
111 instanceof Number //fasle
var num = Number(111)
num instanceof Number //false
var numNew = new Number('111')
numNew instanceof Number //true
delete不会删除在原型上找到的属性
var myFunction = function (a,b,c) {
return arguments.length
}
muFunction() //0
var myFunction1 = function (a,b,c) {
return myFunction1.length
}
myFunction1() //3
在ES3和javascript1.5的函数嵌套中的this是window
var a= function () {
console.log('a')
console.log(this)//window
var b= function (){
console.log('b')
console.log(this)//window
var c = function (){
console.log('c')
console.log(this)//window
}
c()
}
b()
}
其实这个比较好懂 如果在最外层
a的this是window
而后面this就一直没变
被定义为函数表达式的函数没有被提升,只有函数语句被提升
sum() //1
function sum (){
return 1
}
sum2() //Uncaught TypeError: sum2 is not a function(…)
var sum2 = function(){
return 2
}
显示调用全局对象方法比隐式要慢
window.alert(1)//慢
alert(2)//快
笔者认为在自定义的全局函数里,必须要显式的写.
因为如果自定义的函数绑定在全局上
而不显示的写window,代码会变得非常难读
这点性能应该可以忽略
在ES3中函数嵌套容易丢失this
var myObject = {
func1: function() {
console.log(this) //myObject
var func2 = function() {
console.log(this)//ES3: window /ES5 :myObject
}();
}
}
myObject.func1()
但是笔者在chrome试还是丢失了this的,
如果没有使用new 构造函数(),this将变成window
var Person = function (){console.log(this)}
Person()//window
new Person()//Person{}
var a = {
b: function(){
console.log(this) //Object{}
Person() //window
}
}
a.b()
var myFunction = function(){}
myFunction.prototype = {} //浏览器自动执行的
console.log(myFunction.prototype) //object{}
原型链将每个实例都链接至构造函数的prototype属性
即实例.__proto === 构造函数.prototype
Array.prototype.foo = 'foo';
var myArray = [];
console.log(myArray.__proto__ === Array.prototype) //true
console.log(myArray.__proto__.foo) //foo
任何添加到Object.prototype都会出现在for in中
用一个新值替换prototype属性,这样的话其构造函数也会变为新值的构造函数
var Foo =function Foo(){}
Foo.prototype = {}
var FooInstance = new Foo()
cosole.log(FooInstance.constructor) //Object()
//手动把她还原
var Foo1 = function(){}
Foo.prototype = { constructor:Foo1}
var FooInstance1= new Foo1()
console.log(FooInstance1.constructor) //Foo1()