实例是什么
实例:实例对象
类型 :类型对象
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person("dage", 12); //根据类型创建的实例对象 写法上构造函数的类名第一个字母大写
Person("jack", 12); //此时是函数,不推荐这样写
// console.log(typeof p);
undefined 和null的区别
undefined 定义了没有复制 例如: var a ;
null 定义了并且赋值了,只是赋值为null
一般什么时候给变量赋值为null
在给对象赋值之前,对象相关的数值还没准备好,先给对象设置一个null值(表明将要赋值给对象)
var b = null;
console.log(typeof b);
此时打印为Object,但是null是基本数据类型
结束前 给对象赋值为null,方便垃圾回收器回收
变量的类型(通过变量内存值的类型区分)
基本类型 :保存的就是基本类型的数据
引用类型:保存的是地址值
内存分类
栈: 保存全局变量或者局部变量
堆: 保存对象
js如何调用(执行函数)
特殊的地方: test.call/apply(obj) 相当于obj.test() 临时让test()方法成为obj对象的方法进行调用
但是不能直接obj.test() ,因为obj对象原来没有test()方法
var p = {
"name": "Tom",
age: 998,
setName: function(name) {
this.name = name;
},
setAge: function(age) {
this.age = age;
}
};
console.log(p.name, p["age"]);
p.setName("周大哥");
p["content-type"] = "hah";
console.log(p["name"]);
function test() {
this.ceshi = "函数调用测试";
};
// test.call(p);
test.apply(p);
console.log(p.ceshi);
回调函数
- 你定义的
- 你没有调用
- 但它最终执行了
常见的回调函数: dom回调函数(鼠标点击事件)、定时器回调函数、 ajax请求回调函数、生命周期回调函数
立即执行函数表达式
后面可以用来写模块
(function() {
// 匿名函数自调用
console.log("立即执行函数表达式");
})();
(function() {
var a = 1;
function test() {
console.log(++a);
};
// 向外暴露一个全局函数
window.$ = function() {
return {
test: test
};
}
})();
$().test();
// $是一个函数 $()执行后返回的是一个对象,因为{} 打印2
this是什么
- 任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
- 所有函数内部都有一个变量this
- 它的值是调用函数的当前对象
如何确定this的值
调用者
test() window
p.test() p
new test() 新创建的对象
p.call(obj) obj
函数的prototype属性
每个函数都有prototype属性,它默认指向一个Object空对象(原型对象)
原型对象中有一个属性constructor,它指向函数对象
给原型对象添加属性(一般都是方法) 作用:函数的所有实例对象自动拥有原型中的属性(方法)
function Fun() {
}
console.log(Date.prototype, typeof Date.prototype);
console.log(Fun.prototype); //默认指向一个Object空对象(没有我们自定义的属性)
// 原型对象中有一个属性constructor 它指向函数对象
console.log(Date.prototype.constructor === Date, Fun.prototype.constructor === Fun);
// 给原型对象添加属性(一般是方法) 实例对象可以访问
Fun.prototype.test = function() {
console.log("给原型对象添加的方法执行了");
}
Fun.prototype.test();
fun = new Fun();
fun.test();
function Fn() { //相当于此处有内部语句 this.prototype = {}
}
//1. 每个函数function都有一个prototype,即显示原型属性,默认指向一个空的Object对象
console.log(Fn.prototype);
// 2.每个实例对象都有一个__proto__,可称为隐式原型
var fn = new Fn(); //相当于此处有内部语句 this.__proto__ = Fn.prototype
console.log(fn.__proto__);
// 3.对象的隐式原型的值是对象构造函数的显示原型的值
console.log(Fn.prototype === fn.__proto__);
// 给原型添加方法
Fn.prototype.test = function() {
console.log("test()");
}
fn.test();