/javascript

原生javascript学习

Primary LanguageCSS

#javascript 学习笔记

面向对象

创建对象

  • 大量的重复代码

工厂模式

  • 无需重复创建多个相似的对象
  • 无法解决 对象识别

构造函数模式

  • 没有显式的创建对象
  • 直接将属性和方法赋值给了this对象
  • 没有return

按照惯例,构造函数首字母大写

1.将构造函数当做函数

  function Person(name, age, job){
    this.name= name;
    this.age= age;
    this.job = job;
    this.sayName = function(){
      alert(this.name);
    }
  }
  // 1.将构造函数当做函数
  var person1 = new Person("shunzizhan",24,"web前端工程师");
  person1.sayName();
  
  // 作为普通函数调用
  Person("Mark",26,"sgfsgf");
  window.sayName();

  // 在另一个对象的作用域中调用
  var o = new Object();
  Person.call(o,"shunzizhan",27,"web前端工程师");
  o.sayName();

2.构造函数的问题

每个方法都要在每个实例上面重新创建一次 解决办法:把函数定义转移到函数外部

 function Person(name, age, job){
    this.name= name;
    this.age= age;
    this.job = job;
    this.sayName = sayName;
  }

  function sayName(){
    alert(this.name);
  }

原型模式

1.通过hasOwnProperty就知道属性是不是实例的属性,只有属性在实例中,才返回true,否则返回false person3.hasOwnProperty("name")

2.in操作符只要通过对象能够访问到属性就返回true,不论该属性存在于实例中还是原型中 "name" in person3

3.hasPrototypeProperty,属性存在原型即为true,实例中一旦重写,则返回false

  function hasPrototypeProperty(object,name) { 
    return !object.hasOwnProperty(name) && (name in object); 
  } 

4.更简单的原型

  function Person (argument) {
    // body...
  }
  // Person.prototype.name="shunzizhan";
  // Person.prototype.age=24;
  // Person.prototype.job="web前端工程师";
  // Person.prototype.sayName = function(){
  //   alert(this.name);
  // }
  // 简化的原型语法
  Person.prototype = {
    name:"shunzizhan",
    age:24,
    job:"web前端工程师",
    sayName:function(){
      alert(this.name);
    }
  }

但是在这种情况下hasOwnProperty为false

5.原型的动态性

  function Person (argument) {
    // body...
  }
  
  var person1 = new Person();
  Person.prototype.sayName = function(){
    alert("shunzizhan");
  }
  person1.sayName();

   // 注意,如果是重写整个原型对象,调用指针会指向最初的原型对象的_proto_指针
  function Person (argument) {
    // body...
  }
  
  var person1 = new Person();
  Person.prototype = {
    name:"shunzizhan",
    age:24,
    job:"web前端开发",
    sayName:function(){
      alert(this.name);
    }
  }
  person1.sayName();//error

6.原生对象的原型 Object /Array/String

  String.prototype.startWith=function(text){
    return this.indexOf(text)==0;
  }
  var msg ="hello world";
  alert(msg.startWith('hell'));

7.问题:省略构造函数传递参数,所有实例默认情况下取得相同的属性值,最大问题是共享的本质引起

  function Person (argument) {
    // body...
  }
  
  
  Person.prototype = {
    name:"shunzizhan",
    age:24,
    job:"web前端开发",
    friends:['a','b'],
    sayName:function(){
      alert(this.name);
    }
  }
  var person1 =new Person();
  var person2 =new Person();
  person2.friends.push('c');
  alert(person1.friends.join("|"));
  alert(person2.friends.join("|"));