JavaScript基础(3)— 原型/继承

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原型链讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值