1.区分普通对象/函数对象
- 通过new Function() 创建的对象都是函数对象,其他的均为普通对象,其中包括 Function 实例的实例。
Function.__proto__ === Function.prototype//true
function fun1(){};
const fun2 = function(){};
const fun3 = new Function('name','console.log(name)');
const obj1 = {};
const obj2 = new Object();
const obj3 = new fun1();
const obj4 = new new Function();
console.log(typeof Object);//function
console.log(typeof Function);//function
console.log(typeof fun1);//function
console.log(typeof fun2);//function
console.log(typeof fun3);//function
console.log(typeof obj1);//object
console.log(typeof obj2);//object
console.log(typeof obj3);//object
console.log(typeof obj4);//object
***参考链接:函数对象和普通对象
2.区分普通函数/构造函数
- 在命名规则上,构造函数一般是首字母大写,普通函数遵照小驼峰式命名法。
- 函数调用:
– 普通函数:(1)直接调用 fn();(2)在调用函数的内部不会创建新的对象;(3)函数内部的this指向调用函数的对象(如果没有对象调用,默认是window(非严格模式));(4)返回值由return语句决定。
– 构造函数:(1)需要使用new关键字来调用,new fn();(2)构造函数的内部会创建一个新的对象,即fn的实例;(3)函数内部的this指向新创建的实例;(4)默认的返回值是fn的实例。
<script>
//普通函数
function foo() {
var f2 = new foo2();
console.log(f2); //{a: 3}
console.log(this); //window
return true;
}
//构造函数
function foo2() { //内部创建一个实例,this指向该实例
console.log(this); //foo2{} 类型的对象 不是foo2函数
return {a: 3};
}
var f1 = foo();
console.log(f1); // true
</script>
***参考链接:
1、普通函数和构造函数的区别
2、JS中构造函数和普通函数的区别
构造函数例子:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() { alert(this.name) }
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');
上面的例子中,person1和person2都是Person的实例,这两个实例都有一个constructor属性,该属性指向Person,即:person1.constructor === Person; person2.constructor === Person
即:实例的构造函数属性(constructor)指向构造函数
3、原型对象
- 每个对象拥有一个原型对象,对象以其原型为模板,从原型继承属性和方法,这些属性和方法定义在对象的prototype属性上,而非对象实例本身。
- 原型对象 Person.prototype ,如下图:
原型对象Person.prototype上有两个属性,分别是constructor 和 proto,其中 proto 已被弃用。
二、继承
1、目的:让子类能够使用基类的属性和方法。
2、通过原型实现继承:当我们定义函数的时候,js会自动为函数分配一个prototype属性。
3、原型继承的实现方式
- 定义新的构造函数,并在内部用
call()
调用希望继承的构造函数,并绑定this
; - 借助中间函数
F
实现原型继承,最好通过封装的inherit
函数完成; - 继续在新的构造函数的原型上定义新方法。
例子:
function Student(name, age, grade){
Person.call(this, name, age);
this.grade = grade;
}
//--------
function F(){};
F.prototype = Person.prototype;
Student.prototype = new F();
Student.prototype.constructor = Student;
//--------
Student.prototype.sayHello =function(){
alert("Hello, I'm "+ this.name +", I'm in grade " + this.grade + ", nice to meet you.");
};
var wang_son = new Student('老王儿子',8,'二年级');
wang_son.sayHi();//Hi,I'm 老王儿子
wang_son.sayHello();//Hello, I'm 老王儿子, I'm in grade 二年级, nice to meet you.
wang_son.sayHi == wang.sayHi; //结果是true
*** 参考链接:js原型链讲解