扩展$resource对象从工厂中移除原型

Extending $resource object removes prototype from Factory

本文关键字:原型 工厂 resource 对象 扩展      更新时间:2023-09-26

这是我现在的代码:

// Factory
angular.factory('Student', function() {
    var defaults = {
        StudentId: null
    };
    var Student = function(params) {
        angular.extend(this, angular.copy(defaults), params);
    };
    // Prototype function for Student
    Student.prototype.hasStudentId = function() {
        return this.StudentId != null;
    };
});
// Service
angular.service('StudentService', ['Student', '$resource', function(Student, $resource) {
    var service = {};
    service.student = $resource('student/:studentId'. {} { load: {method: 'GET'} });
    service.loadStudent = function(studentId) {
        var currentStudent = service.student.load(studentId); // HTTP call
        currentStudent.$promise.then(function() {
            // I expect the object currentStudent would have hasStudentId() prototype function, but it's not
            angular.extend(currentStudent, new Student(currentStudent));
            // However, if I use 'new' keyword, studentObj has prototype hasStudentId() function
            var studentObj = new Student(currentStudent);
        });
    };
    return service;
}]);

如你所见,在我扩展currentStudent对象后,currentStudent没有原型函数hasStudentId()。但是,如果我使用new Student(currentStudent),它具有正常的原型功能。

角。扩展忽略prototype函数?

目前currentStudent对象只具有$resource的原型函数。

根据文档angular.extend只复制自己的可枚举属性。原型属性可能是可枚举的,但它们不属于对象本身,因此不符合own的条件。MDN对此有一篇文章