构造函数
类似于类的概念 约定俗成 首字母大写
-
简单举个例子:
function Dog(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.action = function() { console.log("吃 撒欢 叫"); } } //调用构造函数 //实例化 关键字 new(把抽象类具体化,把类变成对象) var ahuang = new Dog("阿黄", "2", "母"); var dahei = new Dog("大黑", "2", "母"); var abiao = new Dog("阿🐯", "2", "母"); ahuang.action() console.log(abiao);
-
new在构造函数中做了什么?
1.创建了一个空的对象var obj = {}
2.改变了this指向:call apply bind
Car.call(obj, "w6", "red");
传参:
apply:接收数组
call:接收字符串
3.赋值原型:
obj.__proto__ = Car.prototype;
对象是由自身和原型共同构成的 对象的原型:proto
构造函数是由自身和原型共同构成的 构造函数的原型:prototype
属性写在构造函数里面,方法写在原型上
constructor找到函数本身
console.log(Person.prototype.constructor)
-
类的特征:封装 继承 多态 重载
封装 公有,私有属性function Person(name){ //私有属性 var name=name; //公有属性 this.height="195cm"; this.get=function(){ // get 通过共有方法访问私有属性 return name; } //set方法 设置私有属性 this.set=function(newname){ name=newname; console.log(newname); } } var newPerson=new Person("张三"); console.log(newPerson.get()) console.log(newPerson.set("李四"))
分析结果:首先get是通过公用属性访问私有属性可以访问到,而set与其相反也就访问不到数据,只有内部自身能访问到
继承
function Person(sex, height) {
this.sex = sex;
this.height = height;
// this.hobby=function(){
// console.log("吃苦耐劳")
// }
}
Person.prototype.hobby = function() {
console.log("我是人类")
}
function Student(sex) {
//Person.call(this,sex);
Person.apply(this, [sex]);
//Person.bind(this)(sex);
this.action = function() {
console.log("贪玩");
}
}
//涉及到传址的问题
//Student.prototype=Person.prototype
//重新写子集的方法也会影响到父级
// 解决传址问题
function Link() {};
Link.prototype = Person.prototype;
Student.prototype = new Link();
console.log(Student.prototype);
// Student.prototype.hobby = function() {
// console.log("我是")
// }
// var newStudent=new Student("男");
var newStudent = new Student("男");
//var newStudent=new Student("男");
console.log(newStudent.sex);
newStudent.hobby();
newStudent.action();
var newPerson = new Person("男", "182cm");
console.log(newPerson)
newPerson.hobby()
使用call apply bind方法继承只能继承其属性并不能继承其原型,所以要继承其原型我们还要另想它法,如果我们使用Student.prototype=Person.prototype这种样式来设置的话,这就会涉及传址问题,所以这种方式并不可取,所以最简单有效的方法就是新创建一个构造函数,用来在其中周旋如:function Link() {};Link.prototype = Person.prototype;Student.prototype = new Link();这样使用的话,不认我们怎么改变newStudent的hobby也不会影响其父级的hobby,这样我们就结局了继承问题。